soc-cache.c revision 68d44ee0bc70be30ea1ee936e6e21082193386cf
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
14#include <linux/i2c.h>
15#include <linux/spi/spi.h>
16#include <sound/soc.h>
17#include <linux/lzo.h>
18#include <linux/bitmap.h>
19#include <linux/rbtree.h>
20
21static unsigned int snd_soc_4_12_read(struct snd_soc_codec *codec,
22				     unsigned int reg)
23{
24	int ret;
25	unsigned int val;
26
27	if (reg >= codec->driver->reg_cache_size ||
28		snd_soc_codec_volatile_register(codec, reg)) {
29			if (codec->cache_only)
30				return -1;
31
32			BUG_ON(!codec->hw_read);
33			return codec->hw_read(codec, reg);
34	}
35
36	ret = snd_soc_cache_read(codec, reg, &val);
37	if (ret < 0)
38		return -1;
39	return val;
40}
41
42static int snd_soc_4_12_write(struct snd_soc_codec *codec, unsigned int reg,
43			     unsigned int value)
44{
45	u8 data[2];
46	int ret;
47
48	data[0] = (reg << 4) | ((value >> 8) & 0x000f);
49	data[1] = value & 0x00ff;
50
51	if (!snd_soc_codec_volatile_register(codec, reg) &&
52		reg < codec->driver->reg_cache_size) {
53		ret = snd_soc_cache_write(codec, reg, value);
54		if (ret < 0)
55			return -1;
56	}
57
58	if (codec->cache_only) {
59		codec->cache_sync = 1;
60		return 0;
61	}
62
63	ret = codec->hw_write(codec->control_data, data, 2);
64	if (ret == 2)
65		return 0;
66	if (ret < 0)
67		return ret;
68	else
69		return -EIO;
70}
71
72#if defined(CONFIG_SPI_MASTER)
73static int snd_soc_4_12_spi_write(void *control_data, const char *data,
74				 int len)
75{
76	struct spi_device *spi = control_data;
77	struct spi_transfer t;
78	struct spi_message m;
79	u8 msg[2];
80
81	if (len <= 0)
82		return 0;
83
84	msg[0] = data[1];
85	msg[1] = data[0];
86
87	spi_message_init(&m);
88	memset(&t, 0, sizeof t);
89
90	t.tx_buf = &msg[0];
91	t.len = len;
92
93	spi_message_add_tail(&t, &m);
94	spi_sync(spi, &m);
95
96	return len;
97}
98#else
99#define snd_soc_4_12_spi_write NULL
100#endif
101
102static unsigned int snd_soc_7_9_read(struct snd_soc_codec *codec,
103				     unsigned int reg)
104{
105	int ret;
106	unsigned int val;
107
108	if (reg >= codec->driver->reg_cache_size ||
109		snd_soc_codec_volatile_register(codec, reg)) {
110			if (codec->cache_only)
111				return -1;
112
113			BUG_ON(!codec->hw_read);
114			return codec->hw_read(codec, reg);
115	}
116
117	ret = snd_soc_cache_read(codec, reg, &val);
118	if (ret < 0)
119		return -1;
120	return val;
121}
122
123static int snd_soc_7_9_write(struct snd_soc_codec *codec, unsigned int reg,
124			     unsigned int value)
125{
126	u8 data[2];
127	int ret;
128
129	data[0] = (reg << 1) | ((value >> 8) & 0x0001);
130	data[1] = value & 0x00ff;
131
132	if (!snd_soc_codec_volatile_register(codec, reg) &&
133		reg < codec->driver->reg_cache_size) {
134		ret = snd_soc_cache_write(codec, reg, value);
135		if (ret < 0)
136			return -1;
137	}
138
139	if (codec->cache_only) {
140		codec->cache_sync = 1;
141		return 0;
142	}
143
144	ret = codec->hw_write(codec->control_data, data, 2);
145	if (ret == 2)
146		return 0;
147	if (ret < 0)
148		return ret;
149	else
150		return -EIO;
151}
152
153#if defined(CONFIG_SPI_MASTER)
154static int snd_soc_7_9_spi_write(void *control_data, const char *data,
155				 int len)
156{
157	struct spi_device *spi = control_data;
158	struct spi_transfer t;
159	struct spi_message m;
160	u8 msg[2];
161
162	if (len <= 0)
163		return 0;
164
165	msg[0] = data[0];
166	msg[1] = data[1];
167
168	spi_message_init(&m);
169	memset(&t, 0, sizeof t);
170
171	t.tx_buf = &msg[0];
172	t.len = len;
173
174	spi_message_add_tail(&t, &m);
175	spi_sync(spi, &m);
176
177	return len;
178}
179#else
180#define snd_soc_7_9_spi_write NULL
181#endif
182
183static int snd_soc_8_8_write(struct snd_soc_codec *codec, unsigned int reg,
184			     unsigned int value)
185{
186	u8 data[2];
187	int ret;
188
189	reg &= 0xff;
190	data[0] = reg;
191	data[1] = value & 0xff;
192
193	if (!snd_soc_codec_volatile_register(codec, reg) &&
194		reg < codec->driver->reg_cache_size) {
195		ret = snd_soc_cache_write(codec, reg, value);
196		if (ret < 0)
197			return -1;
198	}
199
200	if (codec->cache_only) {
201		codec->cache_sync = 1;
202		return 0;
203	}
204
205	if (codec->hw_write(codec->control_data, data, 2) == 2)
206		return 0;
207	else
208		return -EIO;
209}
210
211static unsigned int snd_soc_8_8_read(struct snd_soc_codec *codec,
212				     unsigned int reg)
213{
214	int ret;
215	unsigned int val;
216
217	reg &= 0xff;
218	if (reg >= codec->driver->reg_cache_size ||
219		snd_soc_codec_volatile_register(codec, reg)) {
220			if (codec->cache_only)
221				return -1;
222
223			BUG_ON(!codec->hw_read);
224			return codec->hw_read(codec, reg);
225	}
226
227	ret = snd_soc_cache_read(codec, reg, &val);
228	if (ret < 0)
229		return -1;
230	return val;
231}
232
233#if defined(CONFIG_SPI_MASTER)
234static int snd_soc_8_8_spi_write(void *control_data, const char *data,
235				 int len)
236{
237	struct spi_device *spi = control_data;
238	struct spi_transfer t;
239	struct spi_message m;
240	u8 msg[2];
241
242	if (len <= 0)
243		return 0;
244
245	msg[0] = data[0];
246	msg[1] = data[1];
247
248	spi_message_init(&m);
249	memset(&t, 0, sizeof t);
250
251	t.tx_buf = &msg[0];
252	t.len = len;
253
254	spi_message_add_tail(&t, &m);
255	spi_sync(spi, &m);
256
257	return len;
258}
259#else
260#define snd_soc_8_8_spi_write NULL
261#endif
262
263static int snd_soc_8_16_write(struct snd_soc_codec *codec, unsigned int reg,
264			      unsigned int value)
265{
266	u8 data[3];
267	int ret;
268
269	data[0] = reg;
270	data[1] = (value >> 8) & 0xff;
271	data[2] = value & 0xff;
272
273	if (!snd_soc_codec_volatile_register(codec, reg) &&
274		reg < codec->driver->reg_cache_size) {
275		ret = snd_soc_cache_write(codec, reg, value);
276		if (ret < 0)
277			return -1;
278	}
279
280	if (codec->cache_only) {
281		codec->cache_sync = 1;
282		return 0;
283	}
284
285	if (codec->hw_write(codec->control_data, data, 3) == 3)
286		return 0;
287	else
288		return -EIO;
289}
290
291static unsigned int snd_soc_8_16_read(struct snd_soc_codec *codec,
292				      unsigned int reg)
293{
294	int ret;
295	unsigned int val;
296
297	if (reg >= codec->driver->reg_cache_size ||
298	    snd_soc_codec_volatile_register(codec, reg)) {
299		if (codec->cache_only)
300			return -1;
301
302		BUG_ON(!codec->hw_read);
303		return codec->hw_read(codec, reg);
304	}
305
306	ret = snd_soc_cache_read(codec, reg, &val);
307	if (ret < 0)
308		return -1;
309	return val;
310}
311
312#if defined(CONFIG_SPI_MASTER)
313static int snd_soc_8_16_spi_write(void *control_data, const char *data,
314				 int len)
315{
316	struct spi_device *spi = control_data;
317	struct spi_transfer t;
318	struct spi_message m;
319	u8 msg[3];
320
321	if (len <= 0)
322		return 0;
323
324	msg[0] = data[0];
325	msg[1] = data[1];
326	msg[2] = data[2];
327
328	spi_message_init(&m);
329	memset(&t, 0, sizeof t);
330
331	t.tx_buf = &msg[0];
332	t.len = len;
333
334	spi_message_add_tail(&t, &m);
335	spi_sync(spi, &m);
336
337	return len;
338}
339#else
340#define snd_soc_8_16_spi_write NULL
341#endif
342
343#if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
344static unsigned int snd_soc_8_8_read_i2c(struct snd_soc_codec *codec,
345					  unsigned int r)
346{
347	struct i2c_msg xfer[2];
348	u8 reg = r;
349	u8 data;
350	int ret;
351	struct i2c_client *client = codec->control_data;
352
353	/* Write register */
354	xfer[0].addr = client->addr;
355	xfer[0].flags = 0;
356	xfer[0].len = 1;
357	xfer[0].buf = &reg;
358
359	/* Read data */
360	xfer[1].addr = client->addr;
361	xfer[1].flags = I2C_M_RD;
362	xfer[1].len = 1;
363	xfer[1].buf = &data;
364
365	ret = i2c_transfer(client->adapter, xfer, 2);
366	if (ret != 2) {
367		dev_err(&client->dev, "i2c_transfer() returned %d\n", ret);
368		return 0;
369	}
370
371	return data;
372}
373#else
374#define snd_soc_8_8_read_i2c NULL
375#endif
376
377#if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
378static unsigned int snd_soc_8_16_read_i2c(struct snd_soc_codec *codec,
379					  unsigned int r)
380{
381	struct i2c_msg xfer[2];
382	u8 reg = r;
383	u16 data;
384	int ret;
385	struct i2c_client *client = codec->control_data;
386
387	/* Write register */
388	xfer[0].addr = client->addr;
389	xfer[0].flags = 0;
390	xfer[0].len = 1;
391	xfer[0].buf = &reg;
392
393	/* Read data */
394	xfer[1].addr = client->addr;
395	xfer[1].flags = I2C_M_RD;
396	xfer[1].len = 2;
397	xfer[1].buf = (u8 *)&data;
398
399	ret = i2c_transfer(client->adapter, xfer, 2);
400	if (ret != 2) {
401		dev_err(&client->dev, "i2c_transfer() returned %d\n", ret);
402		return 0;
403	}
404
405	return (data >> 8) | ((data & 0xff) << 8);
406}
407#else
408#define snd_soc_8_16_read_i2c NULL
409#endif
410
411#if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
412static unsigned int snd_soc_16_8_read_i2c(struct snd_soc_codec *codec,
413					  unsigned int r)
414{
415	struct i2c_msg xfer[2];
416	u16 reg = r;
417	u8 data;
418	int ret;
419	struct i2c_client *client = codec->control_data;
420
421	/* Write register */
422	xfer[0].addr = client->addr;
423	xfer[0].flags = 0;
424	xfer[0].len = 2;
425	xfer[0].buf = (u8 *)&reg;
426
427	/* Read data */
428	xfer[1].addr = client->addr;
429	xfer[1].flags = I2C_M_RD;
430	xfer[1].len = 1;
431	xfer[1].buf = &data;
432
433	ret = i2c_transfer(client->adapter, xfer, 2);
434	if (ret != 2) {
435		dev_err(&client->dev, "i2c_transfer() returned %d\n", ret);
436		return 0;
437	}
438
439	return data;
440}
441#else
442#define snd_soc_16_8_read_i2c NULL
443#endif
444
445static unsigned int snd_soc_16_8_read(struct snd_soc_codec *codec,
446				     unsigned int reg)
447{
448	int ret;
449	unsigned int val;
450
451	reg &= 0xff;
452	if (reg >= codec->driver->reg_cache_size ||
453		snd_soc_codec_volatile_register(codec, reg)) {
454			if (codec->cache_only)
455				return -1;
456
457			BUG_ON(!codec->hw_read);
458			return codec->hw_read(codec, reg);
459	}
460
461	ret = snd_soc_cache_read(codec, reg, &val);
462	if (ret < 0)
463		return -1;
464	return val;
465}
466
467static int snd_soc_16_8_write(struct snd_soc_codec *codec, unsigned int reg,
468			     unsigned int value)
469{
470	u8 data[3];
471	int ret;
472
473	data[0] = (reg >> 8) & 0xff;
474	data[1] = reg & 0xff;
475	data[2] = value;
476
477	reg &= 0xff;
478	if (!snd_soc_codec_volatile_register(codec, reg) &&
479		reg < codec->driver->reg_cache_size) {
480		ret = snd_soc_cache_write(codec, reg, value);
481		if (ret < 0)
482			return -1;
483	}
484
485	if (codec->cache_only) {
486		codec->cache_sync = 1;
487		return 0;
488	}
489
490	ret = codec->hw_write(codec->control_data, data, 3);
491	if (ret == 3)
492		return 0;
493	if (ret < 0)
494		return ret;
495	else
496		return -EIO;
497}
498
499#if defined(CONFIG_SPI_MASTER)
500static int snd_soc_16_8_spi_write(void *control_data, const char *data,
501				 int len)
502{
503	struct spi_device *spi = control_data;
504	struct spi_transfer t;
505	struct spi_message m;
506	u8 msg[3];
507
508	if (len <= 0)
509		return 0;
510
511	msg[0] = data[0];
512	msg[1] = data[1];
513	msg[2] = data[2];
514
515	spi_message_init(&m);
516	memset(&t, 0, sizeof t);
517
518	t.tx_buf = &msg[0];
519	t.len = len;
520
521	spi_message_add_tail(&t, &m);
522	spi_sync(spi, &m);
523
524	return len;
525}
526#else
527#define snd_soc_16_8_spi_write NULL
528#endif
529
530#if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
531static unsigned int snd_soc_16_16_read_i2c(struct snd_soc_codec *codec,
532					   unsigned int r)
533{
534	struct i2c_msg xfer[2];
535	u16 reg = cpu_to_be16(r);
536	u16 data;
537	int ret;
538	struct i2c_client *client = codec->control_data;
539
540	/* Write register */
541	xfer[0].addr = client->addr;
542	xfer[0].flags = 0;
543	xfer[0].len = 2;
544	xfer[0].buf = (u8 *)&reg;
545
546	/* Read data */
547	xfer[1].addr = client->addr;
548	xfer[1].flags = I2C_M_RD;
549	xfer[1].len = 2;
550	xfer[1].buf = (u8 *)&data;
551
552	ret = i2c_transfer(client->adapter, xfer, 2);
553	if (ret != 2) {
554		dev_err(&client->dev, "i2c_transfer() returned %d\n", ret);
555		return 0;
556	}
557
558	return be16_to_cpu(data);
559}
560#else
561#define snd_soc_16_16_read_i2c NULL
562#endif
563
564static unsigned int snd_soc_16_16_read(struct snd_soc_codec *codec,
565				       unsigned int reg)
566{
567	int ret;
568	unsigned int val;
569
570	if (reg >= codec->driver->reg_cache_size ||
571	    snd_soc_codec_volatile_register(codec, reg)) {
572		if (codec->cache_only)
573			return -1;
574
575		BUG_ON(!codec->hw_read);
576		return codec->hw_read(codec, reg);
577	}
578
579	ret = snd_soc_cache_read(codec, reg, &val);
580	if (ret < 0)
581		return -1;
582
583	return val;
584}
585
586static int snd_soc_16_16_write(struct snd_soc_codec *codec, unsigned int reg,
587			       unsigned int value)
588{
589	u8 data[4];
590	int ret;
591
592	data[0] = (reg >> 8) & 0xff;
593	data[1] = reg & 0xff;
594	data[2] = (value >> 8) & 0xff;
595	data[3] = value & 0xff;
596
597	if (!snd_soc_codec_volatile_register(codec, reg) &&
598		reg < codec->driver->reg_cache_size) {
599		ret = snd_soc_cache_write(codec, reg, value);
600		if (ret < 0)
601			return -1;
602	}
603
604	if (codec->cache_only) {
605		codec->cache_sync = 1;
606		return 0;
607	}
608
609	ret = codec->hw_write(codec->control_data, data, 4);
610	if (ret == 4)
611		return 0;
612	if (ret < 0)
613		return ret;
614	else
615		return -EIO;
616}
617
618#if defined(CONFIG_SPI_MASTER)
619static int snd_soc_16_16_spi_write(void *control_data, const char *data,
620				 int len)
621{
622	struct spi_device *spi = control_data;
623	struct spi_transfer t;
624	struct spi_message m;
625	u8 msg[4];
626
627	if (len <= 0)
628		return 0;
629
630	msg[0] = data[0];
631	msg[1] = data[1];
632	msg[2] = data[2];
633	msg[3] = data[3];
634
635	spi_message_init(&m);
636	memset(&t, 0, sizeof t);
637
638	t.tx_buf = &msg[0];
639	t.len = len;
640
641	spi_message_add_tail(&t, &m);
642	spi_sync(spi, &m);
643
644	return len;
645}
646#else
647#define snd_soc_16_16_spi_write NULL
648#endif
649
650static struct {
651	int addr_bits;
652	int data_bits;
653	int (*write)(struct snd_soc_codec *codec, unsigned int, unsigned int);
654	int (*spi_write)(void *, const char *, int);
655	unsigned int (*read)(struct snd_soc_codec *, unsigned int);
656	unsigned int (*i2c_read)(struct snd_soc_codec *, unsigned int);
657} io_types[] = {
658	{
659		.addr_bits = 4, .data_bits = 12,
660		.write = snd_soc_4_12_write, .read = snd_soc_4_12_read,
661		.spi_write = snd_soc_4_12_spi_write,
662	},
663	{
664		.addr_bits = 7, .data_bits = 9,
665		.write = snd_soc_7_9_write, .read = snd_soc_7_9_read,
666		.spi_write = snd_soc_7_9_spi_write,
667	},
668	{
669		.addr_bits = 8, .data_bits = 8,
670		.write = snd_soc_8_8_write, .read = snd_soc_8_8_read,
671		.i2c_read = snd_soc_8_8_read_i2c,
672		.spi_write = snd_soc_8_8_spi_write,
673	},
674	{
675		.addr_bits = 8, .data_bits = 16,
676		.write = snd_soc_8_16_write, .read = snd_soc_8_16_read,
677		.i2c_read = snd_soc_8_16_read_i2c,
678		.spi_write = snd_soc_8_16_spi_write,
679	},
680	{
681		.addr_bits = 16, .data_bits = 8,
682		.write = snd_soc_16_8_write, .read = snd_soc_16_8_read,
683		.i2c_read = snd_soc_16_8_read_i2c,
684		.spi_write = snd_soc_16_8_spi_write,
685	},
686	{
687		.addr_bits = 16, .data_bits = 16,
688		.write = snd_soc_16_16_write, .read = snd_soc_16_16_read,
689		.i2c_read = snd_soc_16_16_read_i2c,
690		.spi_write = snd_soc_16_16_spi_write,
691	},
692};
693
694/**
695 * snd_soc_codec_set_cache_io: Set up standard I/O functions.
696 *
697 * @codec: CODEC to configure.
698 * @type: Type of cache.
699 * @addr_bits: Number of bits of register address data.
700 * @data_bits: Number of bits of data per register.
701 * @control: Control bus used.
702 *
703 * Register formats are frequently shared between many I2C and SPI
704 * devices.  In order to promote code reuse the ASoC core provides
705 * some standard implementations of CODEC read and write operations
706 * which can be set up using this function.
707 *
708 * The caller is responsible for allocating and initialising the
709 * actual cache.
710 *
711 * Note that at present this code cannot be used by CODECs with
712 * volatile registers.
713 */
714int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
715			       int addr_bits, int data_bits,
716			       enum snd_soc_control_type control)
717{
718	int i;
719
720	for (i = 0; i < ARRAY_SIZE(io_types); i++)
721		if (io_types[i].addr_bits == addr_bits &&
722		    io_types[i].data_bits == data_bits)
723			break;
724	if (i == ARRAY_SIZE(io_types)) {
725		printk(KERN_ERR
726		       "No I/O functions for %d bit address %d bit data\n",
727		       addr_bits, data_bits);
728		return -EINVAL;
729	}
730
731	codec->write = io_types[i].write;
732	codec->read = io_types[i].read;
733
734	switch (control) {
735	case SND_SOC_CUSTOM:
736		break;
737
738	case SND_SOC_I2C:
739#if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
740		codec->hw_write = (hw_write_t)i2c_master_send;
741#endif
742		if (io_types[i].i2c_read)
743			codec->hw_read = io_types[i].i2c_read;
744
745		codec->control_data = container_of(codec->dev,
746						   struct i2c_client,
747						   dev);
748		break;
749
750	case SND_SOC_SPI:
751		if (io_types[i].spi_write)
752			codec->hw_write = io_types[i].spi_write;
753
754		codec->control_data = container_of(codec->dev,
755						   struct spi_device,
756						   dev);
757		break;
758	}
759
760	return 0;
761}
762EXPORT_SYMBOL_GPL(snd_soc_codec_set_cache_io);
763
764struct snd_soc_rbtree_node {
765	struct rb_node node;
766	unsigned int reg;
767	unsigned int value;
768	unsigned int defval;
769} __attribute__ ((packed));
770
771struct snd_soc_rbtree_ctx {
772	struct rb_root root;
773};
774
775static struct snd_soc_rbtree_node *snd_soc_rbtree_lookup(
776	struct rb_root *root, unsigned int reg)
777{
778	struct rb_node *node;
779	struct snd_soc_rbtree_node *rbnode;
780
781	node = root->rb_node;
782	while (node) {
783		rbnode = container_of(node, struct snd_soc_rbtree_node, node);
784		if (rbnode->reg < reg)
785			node = node->rb_left;
786		else if (rbnode->reg > reg)
787			node = node->rb_right;
788		else
789			return rbnode;
790	}
791
792	return NULL;
793}
794
795static int snd_soc_rbtree_insert(struct rb_root *root,
796				 struct snd_soc_rbtree_node *rbnode)
797{
798	struct rb_node **new, *parent;
799	struct snd_soc_rbtree_node *rbnode_tmp;
800
801	parent = NULL;
802	new = &root->rb_node;
803	while (*new) {
804		rbnode_tmp = container_of(*new, struct snd_soc_rbtree_node,
805					  node);
806		parent = *new;
807		if (rbnode_tmp->reg < rbnode->reg)
808			new = &((*new)->rb_left);
809		else if (rbnode_tmp->reg > rbnode->reg)
810			new = &((*new)->rb_right);
811		else
812			return 0;
813	}
814
815	/* insert the node into the rbtree */
816	rb_link_node(&rbnode->node, parent, new);
817	rb_insert_color(&rbnode->node, root);
818
819	return 1;
820}
821
822static int snd_soc_rbtree_cache_sync(struct snd_soc_codec *codec)
823{
824	struct snd_soc_rbtree_ctx *rbtree_ctx;
825	struct rb_node *node;
826	struct snd_soc_rbtree_node *rbnode;
827	unsigned int val;
828	int ret;
829
830	rbtree_ctx = codec->reg_cache;
831	for (node = rb_first(&rbtree_ctx->root); node; node = rb_next(node)) {
832		rbnode = rb_entry(node, struct snd_soc_rbtree_node, node);
833		if (rbnode->value == rbnode->defval)
834			continue;
835		ret = snd_soc_cache_read(codec, rbnode->reg, &val);
836		if (ret)
837			return ret;
838		ret = snd_soc_write(codec, rbnode->reg, val);
839		if (ret)
840			return ret;
841		dev_dbg(codec->dev, "Synced register %#x, value = %#x\n",
842			rbnode->reg, val);
843	}
844
845	return 0;
846}
847
848static int snd_soc_rbtree_cache_write(struct snd_soc_codec *codec,
849				      unsigned int reg, unsigned int value)
850{
851	struct snd_soc_rbtree_ctx *rbtree_ctx;
852	struct snd_soc_rbtree_node *rbnode;
853
854	rbtree_ctx = codec->reg_cache;
855	rbnode = snd_soc_rbtree_lookup(&rbtree_ctx->root, reg);
856	if (rbnode) {
857		if (rbnode->value == value)
858			return 0;
859		rbnode->value = value;
860	} else {
861		/* bail out early, no need to create the rbnode yet */
862		if (!value)
863			return 0;
864		/*
865		 * for uninitialized registers whose value is changed
866		 * from the default zero, create an rbnode and insert
867		 * it into the tree.
868		 */
869		rbnode = kzalloc(sizeof *rbnode, GFP_KERNEL);
870		if (!rbnode)
871			return -ENOMEM;
872		rbnode->reg = reg;
873		rbnode->value = value;
874		snd_soc_rbtree_insert(&rbtree_ctx->root, rbnode);
875	}
876
877	return 0;
878}
879
880static int snd_soc_rbtree_cache_read(struct snd_soc_codec *codec,
881				     unsigned int reg, unsigned int *value)
882{
883	struct snd_soc_rbtree_ctx *rbtree_ctx;
884	struct snd_soc_rbtree_node *rbnode;
885
886	rbtree_ctx = codec->reg_cache;
887	rbnode = snd_soc_rbtree_lookup(&rbtree_ctx->root, reg);
888	if (rbnode) {
889		*value = rbnode->value;
890	} else {
891		/* uninitialized registers default to 0 */
892		*value = 0;
893	}
894
895	return 0;
896}
897
898static int snd_soc_rbtree_cache_exit(struct snd_soc_codec *codec)
899{
900	struct rb_node *next;
901	struct snd_soc_rbtree_ctx *rbtree_ctx;
902	struct snd_soc_rbtree_node *rbtree_node;
903
904	/* if we've already been called then just return */
905	rbtree_ctx = codec->reg_cache;
906	if (!rbtree_ctx)
907		return 0;
908
909	/* free up the rbtree */
910	next = rb_first(&rbtree_ctx->root);
911	while (next) {
912		rbtree_node = rb_entry(next, struct snd_soc_rbtree_node, node);
913		next = rb_next(&rbtree_node->node);
914		rb_erase(&rbtree_node->node, &rbtree_ctx->root);
915		kfree(rbtree_node);
916	}
917
918	/* release the resources */
919	kfree(codec->reg_cache);
920	codec->reg_cache = NULL;
921
922	return 0;
923}
924
925static int snd_soc_rbtree_cache_init(struct snd_soc_codec *codec)
926{
927	struct snd_soc_rbtree_ctx *rbtree_ctx;
928
929	codec->reg_cache = kmalloc(sizeof *rbtree_ctx, GFP_KERNEL);
930	if (!codec->reg_cache)
931		return -ENOMEM;
932
933	rbtree_ctx = codec->reg_cache;
934	rbtree_ctx->root = RB_ROOT;
935
936	if (!codec->reg_def_copy)
937		return 0;
938
939/*
940 * populate the rbtree with the initialized registers.  All other
941 * registers will be inserted into the tree when they are first written.
942 *
943 * The reasoning behind this, is that we need to step through and
944 * dereference the cache in u8/u16 increments without sacrificing
945 * portability.  This could also be done using memcpy() but that would
946 * be slightly more cryptic.
947 */
948#define snd_soc_rbtree_populate(cache)					\
949({									\
950	int ret, i;							\
951	struct snd_soc_rbtree_node *rbtree_node;			\
952									\
953	ret = 0;							\
954	cache = codec->reg_def_copy;					\
955	for (i = 0; i < codec->driver->reg_cache_size; ++i) {		\
956		if (!cache[i])						\
957			continue;					\
958		rbtree_node = kzalloc(sizeof *rbtree_node, GFP_KERNEL);	\
959		if (!rbtree_node) {					\
960			ret = -ENOMEM;					\
961			snd_soc_cache_exit(codec);			\
962			break;						\
963		}							\
964		rbtree_node->reg = i;					\
965		rbtree_node->value = cache[i];				\
966		rbtree_node->defval = cache[i];				\
967		snd_soc_rbtree_insert(&rbtree_ctx->root,		\
968				      rbtree_node);			\
969	}								\
970	ret;								\
971})
972
973	switch (codec->driver->reg_word_size) {
974	case 1: {
975		const u8 *cache;
976
977		return snd_soc_rbtree_populate(cache);
978	}
979	case 2: {
980		const u16 *cache;
981
982		return snd_soc_rbtree_populate(cache);
983	}
984	default:
985		BUG();
986	}
987
988	return 0;
989}
990
991#ifdef CONFIG_SND_SOC_CACHE_LZO
992struct snd_soc_lzo_ctx {
993	void *wmem;
994	void *dst;
995	const void *src;
996	size_t src_len;
997	size_t dst_len;
998	size_t decompressed_size;
999	unsigned long *sync_bmp;
1000	int sync_bmp_nbits;
1001};
1002
1003#define LZO_BLOCK_NUM 8
1004static int snd_soc_lzo_block_count(void)
1005{
1006	return LZO_BLOCK_NUM;
1007}
1008
1009static int snd_soc_lzo_prepare(struct snd_soc_lzo_ctx *lzo_ctx)
1010{
1011	lzo_ctx->wmem = kmalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL);
1012	if (!lzo_ctx->wmem)
1013		return -ENOMEM;
1014	return 0;
1015}
1016
1017static int snd_soc_lzo_compress(struct snd_soc_lzo_ctx *lzo_ctx)
1018{
1019	size_t compress_size;
1020	int ret;
1021
1022	ret = lzo1x_1_compress(lzo_ctx->src, lzo_ctx->src_len,
1023			       lzo_ctx->dst, &compress_size, lzo_ctx->wmem);
1024	if (ret != LZO_E_OK || compress_size > lzo_ctx->dst_len)
1025		return -EINVAL;
1026	lzo_ctx->dst_len = compress_size;
1027	return 0;
1028}
1029
1030static int snd_soc_lzo_decompress(struct snd_soc_lzo_ctx *lzo_ctx)
1031{
1032	size_t dst_len;
1033	int ret;
1034
1035	dst_len = lzo_ctx->dst_len;
1036	ret = lzo1x_decompress_safe(lzo_ctx->src, lzo_ctx->src_len,
1037				    lzo_ctx->dst, &dst_len);
1038	if (ret != LZO_E_OK || dst_len != lzo_ctx->dst_len)
1039		return -EINVAL;
1040	return 0;
1041}
1042
1043static int snd_soc_lzo_compress_cache_block(struct snd_soc_codec *codec,
1044		struct snd_soc_lzo_ctx *lzo_ctx)
1045{
1046	int ret;
1047
1048	lzo_ctx->dst_len = lzo1x_worst_compress(PAGE_SIZE);
1049	lzo_ctx->dst = kmalloc(lzo_ctx->dst_len, GFP_KERNEL);
1050	if (!lzo_ctx->dst) {
1051		lzo_ctx->dst_len = 0;
1052		return -ENOMEM;
1053	}
1054
1055	ret = snd_soc_lzo_compress(lzo_ctx);
1056	if (ret < 0)
1057		return ret;
1058	return 0;
1059}
1060
1061static int snd_soc_lzo_decompress_cache_block(struct snd_soc_codec *codec,
1062		struct snd_soc_lzo_ctx *lzo_ctx)
1063{
1064	int ret;
1065
1066	lzo_ctx->dst_len = lzo_ctx->decompressed_size;
1067	lzo_ctx->dst = kmalloc(lzo_ctx->dst_len, GFP_KERNEL);
1068	if (!lzo_ctx->dst) {
1069		lzo_ctx->dst_len = 0;
1070		return -ENOMEM;
1071	}
1072
1073	ret = snd_soc_lzo_decompress(lzo_ctx);
1074	if (ret < 0)
1075		return ret;
1076	return 0;
1077}
1078
1079static inline int snd_soc_lzo_get_blkindex(struct snd_soc_codec *codec,
1080		unsigned int reg)
1081{
1082	const struct snd_soc_codec_driver *codec_drv;
1083	size_t reg_size;
1084
1085	codec_drv = codec->driver;
1086	reg_size = codec_drv->reg_cache_size * codec_drv->reg_word_size;
1087	return (reg * codec_drv->reg_word_size) /
1088	       DIV_ROUND_UP(reg_size, snd_soc_lzo_block_count());
1089}
1090
1091static inline int snd_soc_lzo_get_blkpos(struct snd_soc_codec *codec,
1092		unsigned int reg)
1093{
1094	const struct snd_soc_codec_driver *codec_drv;
1095	size_t reg_size;
1096
1097	codec_drv = codec->driver;
1098	reg_size = codec_drv->reg_cache_size * codec_drv->reg_word_size;
1099	return reg % (DIV_ROUND_UP(reg_size, snd_soc_lzo_block_count()) /
1100		      codec_drv->reg_word_size);
1101}
1102
1103static inline int snd_soc_lzo_get_blksize(struct snd_soc_codec *codec)
1104{
1105	const struct snd_soc_codec_driver *codec_drv;
1106	size_t reg_size;
1107
1108	codec_drv = codec->driver;
1109	reg_size = codec_drv->reg_cache_size * codec_drv->reg_word_size;
1110	return DIV_ROUND_UP(reg_size, snd_soc_lzo_block_count());
1111}
1112
1113static int snd_soc_lzo_cache_sync(struct snd_soc_codec *codec)
1114{
1115	struct snd_soc_lzo_ctx **lzo_blocks;
1116	unsigned int val;
1117	int i;
1118	int ret;
1119
1120	lzo_blocks = codec->reg_cache;
1121	for_each_set_bit(i, lzo_blocks[0]->sync_bmp, lzo_blocks[0]->sync_bmp_nbits) {
1122		ret = snd_soc_cache_read(codec, i, &val);
1123		if (ret)
1124			return ret;
1125		ret = snd_soc_write(codec, i, val);
1126		if (ret)
1127			return ret;
1128		dev_dbg(codec->dev, "Synced register %#x, value = %#x\n",
1129			i, val);
1130	}
1131
1132	return 0;
1133}
1134
1135static int snd_soc_lzo_cache_write(struct snd_soc_codec *codec,
1136				   unsigned int reg, unsigned int value)
1137{
1138	struct snd_soc_lzo_ctx *lzo_block, **lzo_blocks;
1139	int ret, blkindex, blkpos;
1140	size_t blksize, tmp_dst_len;
1141	void *tmp_dst;
1142
1143	/* index of the compressed lzo block */
1144	blkindex = snd_soc_lzo_get_blkindex(codec, reg);
1145	/* register index within the decompressed block */
1146	blkpos = snd_soc_lzo_get_blkpos(codec, reg);
1147	/* size of the compressed block */
1148	blksize = snd_soc_lzo_get_blksize(codec);
1149	lzo_blocks = codec->reg_cache;
1150	lzo_block = lzo_blocks[blkindex];
1151
1152	/* save the pointer and length of the compressed block */
1153	tmp_dst = lzo_block->dst;
1154	tmp_dst_len = lzo_block->dst_len;
1155
1156	/* prepare the source to be the compressed block */
1157	lzo_block->src = lzo_block->dst;
1158	lzo_block->src_len = lzo_block->dst_len;
1159
1160	/* decompress the block */
1161	ret = snd_soc_lzo_decompress_cache_block(codec, lzo_block);
1162	if (ret < 0) {
1163		kfree(lzo_block->dst);
1164		goto out;
1165	}
1166
1167	/* write the new value to the cache */
1168	switch (codec->driver->reg_word_size) {
1169	case 1: {
1170		u8 *cache;
1171		cache = lzo_block->dst;
1172		if (cache[blkpos] == value) {
1173			kfree(lzo_block->dst);
1174			goto out;
1175		}
1176		cache[blkpos] = value;
1177	}
1178	break;
1179	case 2: {
1180		u16 *cache;
1181		cache = lzo_block->dst;
1182		if (cache[blkpos] == value) {
1183			kfree(lzo_block->dst);
1184			goto out;
1185		}
1186		cache[blkpos] = value;
1187	}
1188	break;
1189	default:
1190		BUG();
1191	}
1192
1193	/* prepare the source to be the decompressed block */
1194	lzo_block->src = lzo_block->dst;
1195	lzo_block->src_len = lzo_block->dst_len;
1196
1197	/* compress the block */
1198	ret = snd_soc_lzo_compress_cache_block(codec, lzo_block);
1199	if (ret < 0) {
1200		kfree(lzo_block->dst);
1201		kfree(lzo_block->src);
1202		goto out;
1203	}
1204
1205	/* set the bit so we know we have to sync this register */
1206	set_bit(reg, lzo_block->sync_bmp);
1207	kfree(tmp_dst);
1208	kfree(lzo_block->src);
1209	return 0;
1210out:
1211	lzo_block->dst = tmp_dst;
1212	lzo_block->dst_len = tmp_dst_len;
1213	return ret;
1214}
1215
1216static int snd_soc_lzo_cache_read(struct snd_soc_codec *codec,
1217				  unsigned int reg, unsigned int *value)
1218{
1219	struct snd_soc_lzo_ctx *lzo_block, **lzo_blocks;
1220	int ret, blkindex, blkpos;
1221	size_t blksize, tmp_dst_len;
1222	void *tmp_dst;
1223
1224	*value = 0;
1225	/* index of the compressed lzo block */
1226	blkindex = snd_soc_lzo_get_blkindex(codec, reg);
1227	/* register index within the decompressed block */
1228	blkpos = snd_soc_lzo_get_blkpos(codec, reg);
1229	/* size of the compressed block */
1230	blksize = snd_soc_lzo_get_blksize(codec);
1231	lzo_blocks = codec->reg_cache;
1232	lzo_block = lzo_blocks[blkindex];
1233
1234	/* save the pointer and length of the compressed block */
1235	tmp_dst = lzo_block->dst;
1236	tmp_dst_len = lzo_block->dst_len;
1237
1238	/* prepare the source to be the compressed block */
1239	lzo_block->src = lzo_block->dst;
1240	lzo_block->src_len = lzo_block->dst_len;
1241
1242	/* decompress the block */
1243	ret = snd_soc_lzo_decompress_cache_block(codec, lzo_block);
1244	if (ret >= 0) {
1245		/* fetch the value from the cache */
1246		switch (codec->driver->reg_word_size) {
1247		case 1: {
1248			u8 *cache;
1249			cache = lzo_block->dst;
1250			*value = cache[blkpos];
1251		}
1252		break;
1253		case 2: {
1254			u16 *cache;
1255			cache = lzo_block->dst;
1256			*value = cache[blkpos];
1257		}
1258		break;
1259		default:
1260			BUG();
1261		}
1262	}
1263
1264	kfree(lzo_block->dst);
1265	/* restore the pointer and length of the compressed block */
1266	lzo_block->dst = tmp_dst;
1267	lzo_block->dst_len = tmp_dst_len;
1268	return 0;
1269}
1270
1271static int snd_soc_lzo_cache_exit(struct snd_soc_codec *codec)
1272{
1273	struct snd_soc_lzo_ctx **lzo_blocks;
1274	int i, blkcount;
1275
1276	lzo_blocks = codec->reg_cache;
1277	if (!lzo_blocks)
1278		return 0;
1279
1280	blkcount = snd_soc_lzo_block_count();
1281	/*
1282	 * the pointer to the bitmap used for syncing the cache
1283	 * is shared amongst all lzo_blocks.  Ensure it is freed
1284	 * only once.
1285	 */
1286	if (lzo_blocks[0])
1287		kfree(lzo_blocks[0]->sync_bmp);
1288	for (i = 0; i < blkcount; ++i) {
1289		if (lzo_blocks[i]) {
1290			kfree(lzo_blocks[i]->wmem);
1291			kfree(lzo_blocks[i]->dst);
1292		}
1293		/* each lzo_block is a pointer returned by kmalloc or NULL */
1294		kfree(lzo_blocks[i]);
1295	}
1296	kfree(lzo_blocks);
1297	codec->reg_cache = NULL;
1298	return 0;
1299}
1300
1301static int snd_soc_lzo_cache_init(struct snd_soc_codec *codec)
1302{
1303	struct snd_soc_lzo_ctx **lzo_blocks;
1304	size_t reg_size, bmp_size;
1305	const struct snd_soc_codec_driver *codec_drv;
1306	int ret, tofree, i, blksize, blkcount;
1307	const char *p, *end;
1308	unsigned long *sync_bmp;
1309
1310	ret = 0;
1311	codec_drv = codec->driver;
1312	reg_size = codec_drv->reg_cache_size * codec_drv->reg_word_size;
1313
1314	/*
1315	 * If we have not been given a default register cache
1316	 * then allocate a dummy zero-ed out region, compress it
1317	 * and remember to free it afterwards.
1318	 */
1319	tofree = 0;
1320	if (!codec->reg_def_copy)
1321		tofree = 1;
1322
1323	if (!codec->reg_def_copy) {
1324		codec->reg_def_copy = kzalloc(reg_size,
1325						       GFP_KERNEL);
1326		if (!codec->reg_def_copy)
1327			return -ENOMEM;
1328	}
1329
1330	blkcount = snd_soc_lzo_block_count();
1331	codec->reg_cache = kzalloc(blkcount * sizeof *lzo_blocks,
1332				   GFP_KERNEL);
1333	if (!codec->reg_cache) {
1334		ret = -ENOMEM;
1335		goto err_tofree;
1336	}
1337	lzo_blocks = codec->reg_cache;
1338
1339	/*
1340	 * allocate a bitmap to be used when syncing the cache with
1341	 * the hardware.  Each time a register is modified, the corresponding
1342	 * bit is set in the bitmap, so we know that we have to sync
1343	 * that register.
1344	 */
1345	bmp_size = codec_drv->reg_cache_size;
1346	sync_bmp = kmalloc(BITS_TO_LONGS(bmp_size) * sizeof(long),
1347			   GFP_KERNEL);
1348	if (!sync_bmp) {
1349		ret = -ENOMEM;
1350		goto err;
1351	}
1352	bitmap_zero(sync_bmp, bmp_size);
1353
1354	/* allocate the lzo blocks and initialize them */
1355	for (i = 0; i < blkcount; ++i) {
1356		lzo_blocks[i] = kzalloc(sizeof **lzo_blocks,
1357					GFP_KERNEL);
1358		if (!lzo_blocks[i]) {
1359			kfree(sync_bmp);
1360			ret = -ENOMEM;
1361			goto err;
1362		}
1363		lzo_blocks[i]->sync_bmp = sync_bmp;
1364		lzo_blocks[i]->sync_bmp_nbits = reg_size;
1365		/* alloc the working space for the compressed block */
1366		ret = snd_soc_lzo_prepare(lzo_blocks[i]);
1367		if (ret < 0)
1368			goto err;
1369	}
1370
1371	blksize = snd_soc_lzo_get_blksize(codec);
1372	p = codec->reg_def_copy;
1373	end = codec->reg_def_copy + reg_size;
1374	/* compress the register map and fill the lzo blocks */
1375	for (i = 0; i < blkcount; ++i, p += blksize) {
1376		lzo_blocks[i]->src = p;
1377		if (p + blksize > end)
1378			lzo_blocks[i]->src_len = end - p;
1379		else
1380			lzo_blocks[i]->src_len = blksize;
1381		ret = snd_soc_lzo_compress_cache_block(codec,
1382						       lzo_blocks[i]);
1383		if (ret < 0)
1384			goto err;
1385		lzo_blocks[i]->decompressed_size =
1386			lzo_blocks[i]->src_len;
1387	}
1388
1389	if (tofree) {
1390		kfree(codec->reg_def_copy);
1391		codec->reg_def_copy = NULL;
1392	}
1393	return 0;
1394err:
1395	snd_soc_cache_exit(codec);
1396err_tofree:
1397	if (tofree) {
1398		kfree(codec->reg_def_copy);
1399		codec->reg_def_copy = NULL;
1400	}
1401	return ret;
1402}
1403#endif
1404
1405static int snd_soc_flat_cache_sync(struct snd_soc_codec *codec)
1406{
1407	int i;
1408	int ret;
1409	const struct snd_soc_codec_driver *codec_drv;
1410	unsigned int val;
1411
1412	codec_drv = codec->driver;
1413	for (i = 0; i < codec_drv->reg_cache_size; ++i) {
1414		ret = snd_soc_cache_read(codec, i, &val);
1415		if (ret)
1416			return ret;
1417		if (codec_drv->reg_cache_default) {
1418			switch (codec_drv->reg_word_size) {
1419			case 1: {
1420				const u8 *cache;
1421
1422				cache = codec_drv->reg_cache_default;
1423				if (cache[i] == val)
1424					continue;
1425			}
1426			break;
1427			case 2: {
1428				const u16 *cache;
1429
1430				cache = codec_drv->reg_cache_default;
1431				if (cache[i] == val)
1432					continue;
1433			}
1434			break;
1435			default:
1436				BUG();
1437			}
1438		}
1439		ret = snd_soc_write(codec, i, val);
1440		if (ret)
1441			return ret;
1442		dev_dbg(codec->dev, "Synced register %#x, value = %#x\n",
1443			i, val);
1444	}
1445	return 0;
1446}
1447
1448static int snd_soc_flat_cache_write(struct snd_soc_codec *codec,
1449				    unsigned int reg, unsigned int value)
1450{
1451	switch (codec->driver->reg_word_size) {
1452	case 1: {
1453		u8 *cache;
1454
1455		cache = codec->reg_cache;
1456		cache[reg] = value;
1457	}
1458	break;
1459	case 2: {
1460		u16 *cache;
1461
1462		cache = codec->reg_cache;
1463		cache[reg] = value;
1464	}
1465	break;
1466	default:
1467		BUG();
1468	}
1469
1470	return 0;
1471}
1472
1473static int snd_soc_flat_cache_read(struct snd_soc_codec *codec,
1474				   unsigned int reg, unsigned int *value)
1475{
1476	switch (codec->driver->reg_word_size) {
1477	case 1: {
1478		u8 *cache;
1479
1480		cache = codec->reg_cache;
1481		*value = cache[reg];
1482	}
1483	break;
1484	case 2: {
1485		u16 *cache;
1486
1487		cache = codec->reg_cache;
1488		*value = cache[reg];
1489	}
1490	break;
1491	default:
1492		BUG();
1493	}
1494
1495	return 0;
1496}
1497
1498static int snd_soc_flat_cache_exit(struct snd_soc_codec *codec)
1499{
1500	if (!codec->reg_cache)
1501		return 0;
1502	kfree(codec->reg_cache);
1503	codec->reg_cache = NULL;
1504	return 0;
1505}
1506
1507static int snd_soc_flat_cache_init(struct snd_soc_codec *codec)
1508{
1509	const struct snd_soc_codec_driver *codec_drv;
1510	size_t reg_size;
1511
1512	codec_drv = codec->driver;
1513	reg_size = codec_drv->reg_cache_size * codec_drv->reg_word_size;
1514
1515	/*
1516	 * for flat compression, we don't need to keep a copy of the
1517	 * original defaults register cache as it will definitely not
1518	 * be marked as __devinitconst
1519	 */
1520	kfree(codec->reg_def_copy);
1521	codec->reg_def_copy = NULL;
1522
1523	if (codec_drv->reg_cache_default)
1524		codec->reg_cache = kmemdup(codec_drv->reg_cache_default,
1525					   reg_size, GFP_KERNEL);
1526	else
1527		codec->reg_cache = kzalloc(reg_size, GFP_KERNEL);
1528	if (!codec->reg_cache)
1529		return -ENOMEM;
1530
1531	return 0;
1532}
1533
1534/* an array of all supported compression types */
1535static const struct snd_soc_cache_ops cache_types[] = {
1536	/* Flat *must* be the first entry for fallback */
1537	{
1538		.id = SND_SOC_FLAT_COMPRESSION,
1539		.name = "flat",
1540		.init = snd_soc_flat_cache_init,
1541		.exit = snd_soc_flat_cache_exit,
1542		.read = snd_soc_flat_cache_read,
1543		.write = snd_soc_flat_cache_write,
1544		.sync = snd_soc_flat_cache_sync
1545	},
1546#ifdef CONFIG_SND_SOC_CACHE_LZO
1547	{
1548		.id = SND_SOC_LZO_COMPRESSION,
1549		.name = "LZO",
1550		.init = snd_soc_lzo_cache_init,
1551		.exit = snd_soc_lzo_cache_exit,
1552		.read = snd_soc_lzo_cache_read,
1553		.write = snd_soc_lzo_cache_write,
1554		.sync = snd_soc_lzo_cache_sync
1555	},
1556#endif
1557	{
1558		.id = SND_SOC_RBTREE_COMPRESSION,
1559		.name = "rbtree",
1560		.init = snd_soc_rbtree_cache_init,
1561		.exit = snd_soc_rbtree_cache_exit,
1562		.read = snd_soc_rbtree_cache_read,
1563		.write = snd_soc_rbtree_cache_write,
1564		.sync = snd_soc_rbtree_cache_sync
1565	}
1566};
1567
1568int snd_soc_cache_init(struct snd_soc_codec *codec)
1569{
1570	int i;
1571
1572	for (i = 0; i < ARRAY_SIZE(cache_types); ++i)
1573		if (cache_types[i].id == codec->compress_type)
1574			break;
1575
1576	/* Fall back to flat compression */
1577	if (i == ARRAY_SIZE(cache_types)) {
1578		dev_warn(codec->dev, "Could not match compress type: %d\n",
1579			 codec->compress_type);
1580		i = 0;
1581	}
1582
1583	mutex_init(&codec->cache_rw_mutex);
1584	codec->cache_ops = &cache_types[i];
1585
1586	if (codec->cache_ops->init) {
1587		if (codec->cache_ops->name)
1588			dev_dbg(codec->dev, "Initializing %s cache for %s codec\n",
1589				codec->cache_ops->name, codec->name);
1590		return codec->cache_ops->init(codec);
1591	}
1592	return -EINVAL;
1593}
1594
1595/*
1596 * NOTE: keep in mind that this function might be called
1597 * multiple times.
1598 */
1599int snd_soc_cache_exit(struct snd_soc_codec *codec)
1600{
1601	if (codec->cache_ops && codec->cache_ops->exit) {
1602		if (codec->cache_ops->name)
1603			dev_dbg(codec->dev, "Destroying %s cache for %s codec\n",
1604				codec->cache_ops->name, codec->name);
1605		return codec->cache_ops->exit(codec);
1606	}
1607	return -EINVAL;
1608}
1609
1610/**
1611 * snd_soc_cache_read: Fetch the value of a given register from the cache.
1612 *
1613 * @codec: CODEC to configure.
1614 * @reg: The register index.
1615 * @value: The value to be returned.
1616 */
1617int snd_soc_cache_read(struct snd_soc_codec *codec,
1618		       unsigned int reg, unsigned int *value)
1619{
1620	int ret;
1621
1622	mutex_lock(&codec->cache_rw_mutex);
1623
1624	if (value && codec->cache_ops && codec->cache_ops->read) {
1625		ret = codec->cache_ops->read(codec, reg, value);
1626		mutex_unlock(&codec->cache_rw_mutex);
1627		return ret;
1628	}
1629
1630	mutex_unlock(&codec->cache_rw_mutex);
1631	return -EINVAL;
1632}
1633EXPORT_SYMBOL_GPL(snd_soc_cache_read);
1634
1635/**
1636 * snd_soc_cache_write: Set the value of a given register in the cache.
1637 *
1638 * @codec: CODEC to configure.
1639 * @reg: The register index.
1640 * @value: The new register value.
1641 */
1642int snd_soc_cache_write(struct snd_soc_codec *codec,
1643			unsigned int reg, unsigned int value)
1644{
1645	int ret;
1646
1647	mutex_lock(&codec->cache_rw_mutex);
1648
1649	if (codec->cache_ops && codec->cache_ops->write) {
1650		ret = codec->cache_ops->write(codec, reg, value);
1651		mutex_unlock(&codec->cache_rw_mutex);
1652		return ret;
1653	}
1654
1655	mutex_unlock(&codec->cache_rw_mutex);
1656	return -EINVAL;
1657}
1658EXPORT_SYMBOL_GPL(snd_soc_cache_write);
1659
1660/**
1661 * snd_soc_cache_sync: Sync the register cache with the hardware.
1662 *
1663 * @codec: CODEC to configure.
1664 *
1665 * Any registers that should not be synced should be marked as
1666 * volatile.  In general drivers can choose not to use the provided
1667 * syncing functionality if they so require.
1668 */
1669int snd_soc_cache_sync(struct snd_soc_codec *codec)
1670{
1671	int ret;
1672
1673	if (!codec->cache_sync) {
1674		return 0;
1675	}
1676
1677	if (codec->cache_ops && codec->cache_ops->sync) {
1678		if (codec->cache_ops->name)
1679			dev_dbg(codec->dev, "Syncing %s cache for %s codec\n",
1680				codec->cache_ops->name, codec->name);
1681		ret = codec->cache_ops->sync(codec);
1682		if (!ret)
1683			codec->cache_sync = 0;
1684		return ret;
1685	}
1686
1687	return -EINVAL;
1688}
1689EXPORT_SYMBOL_GPL(snd_soc_cache_sync);
1690