2 * soc-cache.c -- ASoC register cache helpers
4 * Copyright 2009 Wolfson Microelectronics PLC.
6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
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.
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>
21 static unsigned int snd_soc_4_12_read(struct snd_soc_codec
*codec
,
27 if (reg
>= codec
->driver
->reg_cache_size
||
28 snd_soc_codec_volatile_register(codec
, reg
)) {
29 if (codec
->cache_only
)
32 BUG_ON(!codec
->hw_read
);
33 return codec
->hw_read(codec
, reg
);
36 ret
= snd_soc_cache_read(codec
, reg
, &val
);
42 static int snd_soc_4_12_write(struct snd_soc_codec
*codec
, unsigned int reg
,
48 data
[0] = (reg
<< 4) | ((value
>> 8) & 0x000f);
49 data
[1] = value
& 0x00ff;
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
);
58 if (codec
->cache_only
) {
59 codec
->cache_sync
= 1;
63 ret
= codec
->hw_write(codec
->control_data
, data
, 2);
72 #if defined(CONFIG_SPI_MASTER)
73 static int snd_soc_4_12_spi_write(void *control_data
, const char *data
,
76 struct spi_device
*spi
= control_data
;
77 struct spi_transfer t
;
88 memset(&t
, 0, (sizeof t
));
93 spi_message_add_tail(&t
, &m
);
99 #define snd_soc_4_12_spi_write NULL
102 static unsigned int snd_soc_7_9_read(struct snd_soc_codec
*codec
,
108 if (reg
>= codec
->driver
->reg_cache_size
||
109 snd_soc_codec_volatile_register(codec
, reg
)) {
110 if (codec
->cache_only
)
113 BUG_ON(!codec
->hw_read
);
114 return codec
->hw_read(codec
, reg
);
117 ret
= snd_soc_cache_read(codec
, reg
, &val
);
123 static int snd_soc_7_9_write(struct snd_soc_codec
*codec
, unsigned int reg
,
129 data
[0] = (reg
<< 1) | ((value
>> 8) & 0x0001);
130 data
[1] = value
& 0x00ff;
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
);
139 if (codec
->cache_only
) {
140 codec
->cache_sync
= 1;
144 ret
= codec
->hw_write(codec
->control_data
, data
, 2);
153 #if defined(CONFIG_SPI_MASTER)
154 static int snd_soc_7_9_spi_write(void *control_data
, const char *data
,
157 struct spi_device
*spi
= control_data
;
158 struct spi_transfer t
;
159 struct spi_message m
;
168 spi_message_init(&m
);
169 memset(&t
, 0, (sizeof t
));
174 spi_message_add_tail(&t
, &m
);
180 #define snd_soc_7_9_spi_write NULL
183 static int snd_soc_8_8_write(struct snd_soc_codec
*codec
, unsigned int reg
,
191 data
[1] = value
& 0xff;
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
);
200 if (codec
->cache_only
) {
201 codec
->cache_sync
= 1;
205 if (codec
->hw_write(codec
->control_data
, data
, 2) == 2)
211 static unsigned int snd_soc_8_8_read(struct snd_soc_codec
*codec
,
218 if (reg
>= codec
->driver
->reg_cache_size
||
219 snd_soc_codec_volatile_register(codec
, reg
)) {
220 if (codec
->cache_only
)
223 BUG_ON(!codec
->hw_read
);
224 return codec
->hw_read(codec
, reg
);
227 ret
= snd_soc_cache_read(codec
, reg
, &val
);
233 #if defined(CONFIG_SPI_MASTER)
234 static int snd_soc_8_8_spi_write(void *control_data
, const char *data
,
237 struct spi_device
*spi
= control_data
;
238 struct spi_transfer t
;
239 struct spi_message m
;
248 spi_message_init(&m
);
249 memset(&t
, 0, (sizeof t
));
254 spi_message_add_tail(&t
, &m
);
260 #define snd_soc_8_8_spi_write NULL
263 static int snd_soc_8_16_write(struct snd_soc_codec
*codec
, unsigned int reg
,
270 data
[1] = (value
>> 8) & 0xff;
271 data
[2] = value
& 0xff;
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
);
280 if (codec
->cache_only
) {
281 codec
->cache_sync
= 1;
285 if (codec
->hw_write(codec
->control_data
, data
, 3) == 3)
291 static unsigned int snd_soc_8_16_read(struct snd_soc_codec
*codec
,
297 if (reg
>= codec
->driver
->reg_cache_size
||
298 snd_soc_codec_volatile_register(codec
, reg
)) {
299 if (codec
->cache_only
)
302 BUG_ON(!codec
->hw_read
);
303 return codec
->hw_read(codec
, reg
);
306 ret
= snd_soc_cache_read(codec
, reg
, &val
);
312 #if defined(CONFIG_SPI_MASTER)
313 static int snd_soc_8_16_spi_write(void *control_data
, const char *data
,
316 struct spi_device
*spi
= control_data
;
317 struct spi_transfer t
;
318 struct spi_message m
;
328 spi_message_init(&m
);
329 memset(&t
, 0, (sizeof t
));
334 spi_message_add_tail(&t
, &m
);
340 #define snd_soc_8_16_spi_write NULL
343 #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
344 static unsigned int snd_soc_8_8_read_i2c(struct snd_soc_codec
*codec
,
347 struct i2c_msg xfer
[2];
351 struct i2c_client
*client
= codec
->control_data
;
354 xfer
[0].addr
= client
->addr
;
360 xfer
[1].addr
= client
->addr
;
361 xfer
[1].flags
= I2C_M_RD
;
365 ret
= i2c_transfer(client
->adapter
, xfer
, 2);
367 dev_err(&client
->dev
, "i2c_transfer() returned %d\n", ret
);
374 #define snd_soc_8_8_read_i2c NULL
377 #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
378 static unsigned int snd_soc_8_16_read_i2c(struct snd_soc_codec
*codec
,
381 struct i2c_msg xfer
[2];
385 struct i2c_client
*client
= codec
->control_data
;
388 xfer
[0].addr
= client
->addr
;
394 xfer
[1].addr
= client
->addr
;
395 xfer
[1].flags
= I2C_M_RD
;
397 xfer
[1].buf
= (u8
*)&data
;
399 ret
= i2c_transfer(client
->adapter
, xfer
, 2);
401 dev_err(&client
->dev
, "i2c_transfer() returned %d\n", ret
);
405 return (data
>> 8) | ((data
& 0xff) << 8);
408 #define snd_soc_8_16_read_i2c NULL
411 #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
412 static unsigned int snd_soc_16_8_read_i2c(struct snd_soc_codec
*codec
,
415 struct i2c_msg xfer
[2];
419 struct i2c_client
*client
= codec
->control_data
;
422 xfer
[0].addr
= client
->addr
;
425 xfer
[0].buf
= (u8
*)®
;
428 xfer
[1].addr
= client
->addr
;
429 xfer
[1].flags
= I2C_M_RD
;
433 ret
= i2c_transfer(client
->adapter
, xfer
, 2);
435 dev_err(&client
->dev
, "i2c_transfer() returned %d\n", ret
);
442 #define snd_soc_16_8_read_i2c NULL
445 static unsigned int snd_soc_16_8_read(struct snd_soc_codec
*codec
,
452 if (reg
>= codec
->driver
->reg_cache_size
||
453 snd_soc_codec_volatile_register(codec
, reg
)) {
454 if (codec
->cache_only
)
457 BUG_ON(!codec
->hw_read
);
458 return codec
->hw_read(codec
, reg
);
461 ret
= snd_soc_cache_read(codec
, reg
, &val
);
467 static int snd_soc_16_8_write(struct snd_soc_codec
*codec
, unsigned int reg
,
473 data
[0] = (reg
>> 8) & 0xff;
474 data
[1] = 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
);
485 if (codec
->cache_only
) {
486 codec
->cache_sync
= 1;
490 ret
= codec
->hw_write(codec
->control_data
, data
, 3);
499 #if defined(CONFIG_SPI_MASTER)
500 static int snd_soc_16_8_spi_write(void *control_data
, const char *data
,
503 struct spi_device
*spi
= control_data
;
504 struct spi_transfer t
;
505 struct spi_message m
;
515 spi_message_init(&m
);
516 memset(&t
, 0, (sizeof t
));
521 spi_message_add_tail(&t
, &m
);
527 #define snd_soc_16_8_spi_write NULL
530 #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
531 static unsigned int snd_soc_16_16_read_i2c(struct snd_soc_codec
*codec
,
534 struct i2c_msg xfer
[2];
535 u16 reg
= cpu_to_be16(r
);
538 struct i2c_client
*client
= codec
->control_data
;
541 xfer
[0].addr
= client
->addr
;
544 xfer
[0].buf
= (u8
*)®
;
547 xfer
[1].addr
= client
->addr
;
548 xfer
[1].flags
= I2C_M_RD
;
550 xfer
[1].buf
= (u8
*)&data
;
552 ret
= i2c_transfer(client
->adapter
, xfer
, 2);
554 dev_err(&client
->dev
, "i2c_transfer() returned %d\n", ret
);
558 return be16_to_cpu(data
);
561 #define snd_soc_16_16_read_i2c NULL
564 static unsigned int snd_soc_16_16_read(struct snd_soc_codec
*codec
,
570 if (reg
>= codec
->driver
->reg_cache_size
||
571 snd_soc_codec_volatile_register(codec
, reg
)) {
572 if (codec
->cache_only
)
575 BUG_ON(!codec
->hw_read
);
576 return codec
->hw_read(codec
, reg
);
579 ret
= snd_soc_cache_read(codec
, reg
, &val
);
586 static int snd_soc_16_16_write(struct snd_soc_codec
*codec
, unsigned int reg
,
592 data
[0] = (reg
>> 8) & 0xff;
593 data
[1] = reg
& 0xff;
594 data
[2] = (value
>> 8) & 0xff;
595 data
[3] = value
& 0xff;
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
);
604 if (codec
->cache_only
) {
605 codec
->cache_sync
= 1;
609 ret
= codec
->hw_write(codec
->control_data
, data
, 4);
618 #if defined(CONFIG_SPI_MASTER)
619 static int snd_soc_16_16_spi_write(void *control_data
, const char *data
,
622 struct spi_device
*spi
= control_data
;
623 struct spi_transfer t
;
624 struct spi_message m
;
635 spi_message_init(&m
);
636 memset(&t
, 0, (sizeof t
));
641 spi_message_add_tail(&t
, &m
);
647 #define snd_soc_16_16_spi_write NULL
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);
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
,
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
,
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
,
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
,
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
,
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
,
695 * snd_soc_codec_set_cache_io: Set up standard I/O functions.
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.
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.
708 * The caller is responsible for allocating and initialising the
711 * Note that at present this code cannot be used by CODECs with
712 * volatile registers.
714 int 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
)
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
)
724 if (i
== ARRAY_SIZE(io_types
)) {
726 "No I/O functions for %d bit address %d bit data\n",
727 addr_bits
, data_bits
);
731 codec
->write
= io_types
[i
].write
;
732 codec
->read
= io_types
[i
].read
;
739 #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
740 codec
->hw_write
= (hw_write_t
)i2c_master_send
;
742 if (io_types
[i
].i2c_read
)
743 codec
->hw_read
= io_types
[i
].i2c_read
;
745 codec
->control_data
= container_of(codec
->dev
,
751 if (io_types
[i
].spi_write
)
752 codec
->hw_write
= io_types
[i
].spi_write
;
754 codec
->control_data
= container_of(codec
->dev
,
762 EXPORT_SYMBOL_GPL(snd_soc_codec_set_cache_io
);
764 struct snd_soc_rbtree_node
{
769 } __attribute__ ((packed
));
771 struct snd_soc_rbtree_ctx
{
775 static struct snd_soc_rbtree_node
*snd_soc_rbtree_lookup(
776 struct rb_root
*root
, unsigned int reg
)
778 struct rb_node
*node
;
779 struct snd_soc_rbtree_node
*rbnode
;
781 node
= root
->rb_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
;
795 static int snd_soc_rbtree_insert(struct rb_root
*root
,
796 struct snd_soc_rbtree_node
*rbnode
)
798 struct rb_node
**new, *parent
;
799 struct snd_soc_rbtree_node
*rbnode_tmp
;
802 new = &root
->rb_node
;
804 rbnode_tmp
= container_of(*new, struct snd_soc_rbtree_node
,
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
);
815 /* insert the node into the rbtree */
816 rb_link_node(&rbnode
->node
, parent
, new);
817 rb_insert_color(&rbnode
->node
, root
);
822 static int snd_soc_rbtree_cache_sync(struct snd_soc_codec
*codec
)
824 struct snd_soc_rbtree_ctx
*rbtree_ctx
;
825 struct rb_node
*node
;
826 struct snd_soc_rbtree_node
*rbnode
;
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
)
835 ret
= snd_soc_cache_read(codec
, rbnode
->reg
, &val
);
838 ret
= snd_soc_write(codec
, rbnode
->reg
, val
);
841 dev_dbg(codec
->dev
, "Synced register %#x, value = %#x\n",
848 static int snd_soc_rbtree_cache_write(struct snd_soc_codec
*codec
,
849 unsigned int reg
, unsigned int value
)
851 struct snd_soc_rbtree_ctx
*rbtree_ctx
;
852 struct snd_soc_rbtree_node
*rbnode
;
854 rbtree_ctx
= codec
->reg_cache
;
855 rbnode
= snd_soc_rbtree_lookup(&rbtree_ctx
->root
, reg
);
857 if (rbnode
->value
== value
)
859 rbnode
->value
= value
;
861 /* bail out early, no need to create the rbnode yet */
865 * for uninitialized registers whose value is changed
866 * from the default zero, create an rbnode and insert
869 rbnode
= kzalloc(sizeof *rbnode
, GFP_KERNEL
);
873 rbnode
->value
= value
;
874 snd_soc_rbtree_insert(&rbtree_ctx
->root
, rbnode
);
880 static int snd_soc_rbtree_cache_read(struct snd_soc_codec
*codec
,
881 unsigned int reg
, unsigned int *value
)
883 struct snd_soc_rbtree_ctx
*rbtree_ctx
;
884 struct snd_soc_rbtree_node
*rbnode
;
886 rbtree_ctx
= codec
->reg_cache
;
887 rbnode
= snd_soc_rbtree_lookup(&rbtree_ctx
->root
, reg
);
889 *value
= rbnode
->value
;
891 /* uninitialized registers default to 0 */
898 static int snd_soc_rbtree_cache_exit(struct snd_soc_codec
*codec
)
900 struct rb_node
*next
;
901 struct snd_soc_rbtree_ctx
*rbtree_ctx
;
902 struct snd_soc_rbtree_node
*rbtree_node
;
904 /* if we've already been called then just return */
905 rbtree_ctx
= codec
->reg_cache
;
909 /* free up the rbtree */
910 next
= rb_first(&rbtree_ctx
->root
);
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
);
918 /* release the resources */
919 kfree(codec
->reg_cache
);
920 codec
->reg_cache
= NULL
;
925 static int snd_soc_rbtree_cache_init(struct snd_soc_codec
*codec
)
927 struct snd_soc_rbtree_ctx
*rbtree_ctx
;
929 codec
->reg_cache
= kmalloc(sizeof *rbtree_ctx
, GFP_KERNEL
);
930 if (!codec
->reg_cache
)
933 rbtree_ctx
= codec
->reg_cache
;
934 rbtree_ctx
->root
= RB_ROOT
;
936 if (!codec
->driver
->reg_cache_default
)
940 * populate the rbtree with the initialized registers. All other
941 * registers will be inserted into the tree when they are first written.
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.
948 #define snd_soc_rbtree_populate(cache) \
951 struct snd_soc_rbtree_node *rbtree_node; \
954 cache = codec->driver->reg_cache_default; \
955 for (i = 0; i < codec->driver->reg_cache_size; ++i) { \
958 rbtree_node = kzalloc(sizeof *rbtree_node, GFP_KERNEL); \
959 if (!rbtree_node) { \
961 snd_soc_cache_exit(codec); \
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, \
973 switch (codec
->driver
->reg_word_size
) {
977 return snd_soc_rbtree_populate(cache
);
982 return snd_soc_rbtree_populate(cache
);
991 struct snd_soc_lzo_ctx
{
997 size_t decompressed_size
;
998 unsigned long *sync_bmp
;
1002 #define LZO_BLOCK_NUM 8
1003 static int snd_soc_lzo_block_count(void)
1005 return LZO_BLOCK_NUM
;
1008 static int snd_soc_lzo_prepare(struct snd_soc_lzo_ctx
*lzo_ctx
)
1010 lzo_ctx
->wmem
= kmalloc(LZO1X_MEM_COMPRESS
, GFP_KERNEL
);
1016 static int snd_soc_lzo_compress(struct snd_soc_lzo_ctx
*lzo_ctx
)
1018 size_t compress_size
;
1021 ret
= lzo1x_1_compress(lzo_ctx
->src
, lzo_ctx
->src_len
,
1022 lzo_ctx
->dst
, &compress_size
, lzo_ctx
->wmem
);
1023 if (ret
!= LZO_E_OK
|| compress_size
> lzo_ctx
->dst_len
)
1025 lzo_ctx
->dst_len
= compress_size
;
1029 static int snd_soc_lzo_decompress(struct snd_soc_lzo_ctx
*lzo_ctx
)
1034 dst_len
= lzo_ctx
->dst_len
;
1035 ret
= lzo1x_decompress_safe(lzo_ctx
->src
, lzo_ctx
->src_len
,
1036 lzo_ctx
->dst
, &dst_len
);
1037 if (ret
!= LZO_E_OK
|| dst_len
!= lzo_ctx
->dst_len
)
1042 static int snd_soc_lzo_compress_cache_block(struct snd_soc_codec
*codec
,
1043 struct snd_soc_lzo_ctx
*lzo_ctx
)
1047 lzo_ctx
->dst_len
= lzo1x_worst_compress(PAGE_SIZE
);
1048 lzo_ctx
->dst
= kmalloc(lzo_ctx
->dst_len
, GFP_KERNEL
);
1049 if (!lzo_ctx
->dst
) {
1050 lzo_ctx
->dst_len
= 0;
1054 ret
= snd_soc_lzo_compress(lzo_ctx
);
1060 static int snd_soc_lzo_decompress_cache_block(struct snd_soc_codec
*codec
,
1061 struct snd_soc_lzo_ctx
*lzo_ctx
)
1065 lzo_ctx
->dst_len
= lzo_ctx
->decompressed_size
;
1066 lzo_ctx
->dst
= kmalloc(lzo_ctx
->dst_len
, GFP_KERNEL
);
1067 if (!lzo_ctx
->dst
) {
1068 lzo_ctx
->dst_len
= 0;
1072 ret
= snd_soc_lzo_decompress(lzo_ctx
);
1078 static inline int snd_soc_lzo_get_blkindex(struct snd_soc_codec
*codec
,
1081 struct snd_soc_codec_driver
*codec_drv
;
1084 codec_drv
= codec
->driver
;
1085 reg_size
= codec_drv
->reg_cache_size
* codec_drv
->reg_word_size
;
1086 return (reg
* codec_drv
->reg_word_size
) /
1087 DIV_ROUND_UP(reg_size
, snd_soc_lzo_block_count());
1090 static inline int snd_soc_lzo_get_blkpos(struct snd_soc_codec
*codec
,
1093 struct snd_soc_codec_driver
*codec_drv
;
1096 codec_drv
= codec
->driver
;
1097 reg_size
= codec_drv
->reg_cache_size
* codec_drv
->reg_word_size
;
1098 return reg
% (DIV_ROUND_UP(reg_size
, snd_soc_lzo_block_count()) /
1099 codec_drv
->reg_word_size
);
1102 static inline int snd_soc_lzo_get_blksize(struct snd_soc_codec
*codec
)
1104 struct snd_soc_codec_driver
*codec_drv
;
1107 codec_drv
= codec
->driver
;
1108 reg_size
= codec_drv
->reg_cache_size
* codec_drv
->reg_word_size
;
1109 return DIV_ROUND_UP(reg_size
, snd_soc_lzo_block_count());
1112 static int snd_soc_lzo_cache_sync(struct snd_soc_codec
*codec
)
1114 struct snd_soc_lzo_ctx
**lzo_blocks
;
1119 lzo_blocks
= codec
->reg_cache
;
1120 for_each_set_bit(i
, lzo_blocks
[0]->sync_bmp
, lzo_blocks
[0]->sync_bmp_nbits
) {
1121 ret
= snd_soc_cache_read(codec
, i
, &val
);
1124 ret
= snd_soc_write(codec
, i
, val
);
1127 dev_dbg(codec
->dev
, "Synced register %#x, value = %#x\n",
1134 static int snd_soc_lzo_cache_write(struct snd_soc_codec
*codec
,
1135 unsigned int reg
, unsigned int value
)
1137 struct snd_soc_lzo_ctx
*lzo_block
, **lzo_blocks
;
1138 int ret
, blkindex
, blkpos
;
1139 size_t blksize
, tmp_dst_len
;
1142 /* index of the compressed lzo block */
1143 blkindex
= snd_soc_lzo_get_blkindex(codec
, reg
);
1144 /* register index within the decompressed block */
1145 blkpos
= snd_soc_lzo_get_blkpos(codec
, reg
);
1146 /* size of the compressed block */
1147 blksize
= snd_soc_lzo_get_blksize(codec
);
1148 lzo_blocks
= codec
->reg_cache
;
1149 lzo_block
= lzo_blocks
[blkindex
];
1151 /* save the pointer and length of the compressed block */
1152 tmp_dst
= lzo_block
->dst
;
1153 tmp_dst_len
= lzo_block
->dst_len
;
1155 /* prepare the source to be the compressed block */
1156 lzo_block
->src
= lzo_block
->dst
;
1157 lzo_block
->src_len
= lzo_block
->dst_len
;
1159 /* decompress the block */
1160 ret
= snd_soc_lzo_decompress_cache_block(codec
, lzo_block
);
1162 kfree(lzo_block
->dst
);
1166 /* write the new value to the cache */
1167 switch (codec
->driver
->reg_word_size
) {
1170 cache
= lzo_block
->dst
;
1171 if (cache
[blkpos
] == value
) {
1172 kfree(lzo_block
->dst
);
1175 cache
[blkpos
] = value
;
1180 cache
= lzo_block
->dst
;
1181 if (cache
[blkpos
] == value
) {
1182 kfree(lzo_block
->dst
);
1185 cache
[blkpos
] = value
;
1192 /* prepare the source to be the decompressed block */
1193 lzo_block
->src
= lzo_block
->dst
;
1194 lzo_block
->src_len
= lzo_block
->dst_len
;
1196 /* compress the block */
1197 ret
= snd_soc_lzo_compress_cache_block(codec
, lzo_block
);
1199 kfree(lzo_block
->dst
);
1200 kfree(lzo_block
->src
);
1204 /* set the bit so we know we have to sync this register */
1205 set_bit(reg
, lzo_block
->sync_bmp
);
1207 kfree(lzo_block
->src
);
1210 lzo_block
->dst
= tmp_dst
;
1211 lzo_block
->dst_len
= tmp_dst_len
;
1215 static int snd_soc_lzo_cache_read(struct snd_soc_codec
*codec
,
1216 unsigned int reg
, unsigned int *value
)
1218 struct snd_soc_lzo_ctx
*lzo_block
, **lzo_blocks
;
1219 int ret
, blkindex
, blkpos
;
1220 size_t blksize
, tmp_dst_len
;
1224 /* index of the compressed lzo block */
1225 blkindex
= snd_soc_lzo_get_blkindex(codec
, reg
);
1226 /* register index within the decompressed block */
1227 blkpos
= snd_soc_lzo_get_blkpos(codec
, reg
);
1228 /* size of the compressed block */
1229 blksize
= snd_soc_lzo_get_blksize(codec
);
1230 lzo_blocks
= codec
->reg_cache
;
1231 lzo_block
= lzo_blocks
[blkindex
];
1233 /* save the pointer and length of the compressed block */
1234 tmp_dst
= lzo_block
->dst
;
1235 tmp_dst_len
= lzo_block
->dst_len
;
1237 /* prepare the source to be the compressed block */
1238 lzo_block
->src
= lzo_block
->dst
;
1239 lzo_block
->src_len
= lzo_block
->dst_len
;
1241 /* decompress the block */
1242 ret
= snd_soc_lzo_decompress_cache_block(codec
, lzo_block
);
1244 /* fetch the value from the cache */
1245 switch (codec
->driver
->reg_word_size
) {
1248 cache
= lzo_block
->dst
;
1249 *value
= cache
[blkpos
];
1254 cache
= lzo_block
->dst
;
1255 *value
= cache
[blkpos
];
1263 kfree(lzo_block
->dst
);
1264 /* restore the pointer and length of the compressed block */
1265 lzo_block
->dst
= tmp_dst
;
1266 lzo_block
->dst_len
= tmp_dst_len
;
1270 static int snd_soc_lzo_cache_exit(struct snd_soc_codec
*codec
)
1272 struct snd_soc_lzo_ctx
**lzo_blocks
;
1275 lzo_blocks
= codec
->reg_cache
;
1279 blkcount
= snd_soc_lzo_block_count();
1281 * the pointer to the bitmap used for syncing the cache
1282 * is shared amongst all lzo_blocks. Ensure it is freed
1286 kfree(lzo_blocks
[0]->sync_bmp
);
1287 for (i
= 0; i
< blkcount
; ++i
) {
1288 if (lzo_blocks
[i
]) {
1289 kfree(lzo_blocks
[i
]->wmem
);
1290 kfree(lzo_blocks
[i
]->dst
);
1292 /* each lzo_block is a pointer returned by kmalloc or NULL */
1293 kfree(lzo_blocks
[i
]);
1296 codec
->reg_cache
= NULL
;
1300 static int snd_soc_lzo_cache_init(struct snd_soc_codec
*codec
)
1302 struct snd_soc_lzo_ctx
**lzo_blocks
;
1303 size_t reg_size
, bmp_size
;
1304 struct snd_soc_codec_driver
*codec_drv
;
1305 int ret
, tofree
, i
, blksize
, blkcount
;
1306 const char *p
, *end
;
1307 unsigned long *sync_bmp
;
1310 codec_drv
= codec
->driver
;
1311 reg_size
= codec_drv
->reg_cache_size
* codec_drv
->reg_word_size
;
1314 * If we have not been given a default register cache
1315 * then allocate a dummy zero-ed out region, compress it
1316 * and remember to free it afterwards.
1319 if (!codec_drv
->reg_cache_default
)
1322 if (!codec_drv
->reg_cache_default
) {
1323 codec_drv
->reg_cache_default
= kzalloc(reg_size
,
1325 if (!codec_drv
->reg_cache_default
)
1329 blkcount
= snd_soc_lzo_block_count();
1330 codec
->reg_cache
= kzalloc(blkcount
* sizeof *lzo_blocks
,
1332 if (!codec
->reg_cache
) {
1336 lzo_blocks
= codec
->reg_cache
;
1339 * allocate a bitmap to be used when syncing the cache with
1340 * the hardware. Each time a register is modified, the corresponding
1341 * bit is set in the bitmap, so we know that we have to sync
1344 bmp_size
= codec_drv
->reg_cache_size
;
1345 sync_bmp
= kmalloc(BITS_TO_LONGS(bmp_size
) * sizeof (long),
1351 bitmap_zero(sync_bmp
, bmp_size
);
1353 /* allocate the lzo blocks and initialize them */
1354 for (i
= 0; i
< blkcount
; ++i
) {
1355 lzo_blocks
[i
] = kzalloc(sizeof **lzo_blocks
,
1357 if (!lzo_blocks
[i
]) {
1362 lzo_blocks
[i
]->sync_bmp
= sync_bmp
;
1363 lzo_blocks
[i
]->sync_bmp_nbits
= reg_size
;
1364 /* alloc the working space for the compressed block */
1365 ret
= snd_soc_lzo_prepare(lzo_blocks
[i
]);
1370 blksize
= snd_soc_lzo_get_blksize(codec
);
1371 p
= codec_drv
->reg_cache_default
;
1372 end
= codec_drv
->reg_cache_default
+ reg_size
;
1373 /* compress the register map and fill the lzo blocks */
1374 for (i
= 0; i
< blkcount
; ++i
, p
+= blksize
) {
1375 lzo_blocks
[i
]->src
= p
;
1376 if (p
+ blksize
> end
)
1377 lzo_blocks
[i
]->src_len
= end
- p
;
1379 lzo_blocks
[i
]->src_len
= blksize
;
1380 ret
= snd_soc_lzo_compress_cache_block(codec
,
1384 lzo_blocks
[i
]->decompressed_size
=
1385 lzo_blocks
[i
]->src_len
;
1389 kfree(codec_drv
->reg_cache_default
);
1392 snd_soc_cache_exit(codec
);
1395 kfree(codec_drv
->reg_cache_default
);
1399 static int snd_soc_flat_cache_sync(struct snd_soc_codec
*codec
)
1403 struct snd_soc_codec_driver
*codec_drv
;
1406 codec_drv
= codec
->driver
;
1407 for (i
= 0; i
< codec_drv
->reg_cache_size
; ++i
) {
1408 ret
= snd_soc_cache_read(codec
, i
, &val
);
1411 if (codec_drv
->reg_cache_default
) {
1412 switch (codec_drv
->reg_word_size
) {
1416 cache
= codec_drv
->reg_cache_default
;
1417 if (cache
[i
] == val
)
1424 cache
= codec_drv
->reg_cache_default
;
1425 if (cache
[i
] == val
)
1433 ret
= snd_soc_write(codec
, i
, val
);
1436 dev_dbg(codec
->dev
, "Synced register %#x, value = %#x\n",
1442 static int snd_soc_flat_cache_write(struct snd_soc_codec
*codec
,
1443 unsigned int reg
, unsigned int value
)
1445 switch (codec
->driver
->reg_word_size
) {
1449 cache
= codec
->reg_cache
;
1456 cache
= codec
->reg_cache
;
1467 static int snd_soc_flat_cache_read(struct snd_soc_codec
*codec
,
1468 unsigned int reg
, unsigned int *value
)
1470 switch (codec
->driver
->reg_word_size
) {
1474 cache
= codec
->reg_cache
;
1475 *value
= cache
[reg
];
1481 cache
= codec
->reg_cache
;
1482 *value
= cache
[reg
];
1492 static int snd_soc_flat_cache_exit(struct snd_soc_codec
*codec
)
1494 if (!codec
->reg_cache
)
1496 kfree(codec
->reg_cache
);
1497 codec
->reg_cache
= NULL
;
1501 static int snd_soc_flat_cache_init(struct snd_soc_codec
*codec
)
1503 struct snd_soc_codec_driver
*codec_drv
;
1506 codec_drv
= codec
->driver
;
1507 reg_size
= codec_drv
->reg_cache_size
* codec_drv
->reg_word_size
;
1509 if (codec_drv
->reg_cache_default
)
1510 codec
->reg_cache
= kmemdup(codec_drv
->reg_cache_default
,
1511 reg_size
, GFP_KERNEL
);
1513 codec
->reg_cache
= kzalloc(reg_size
, GFP_KERNEL
);
1514 if (!codec
->reg_cache
)
1520 /* an array of all supported compression types */
1521 static const struct snd_soc_cache_ops cache_types
[] = {
1523 .id
= SND_SOC_FLAT_COMPRESSION
,
1524 .init
= snd_soc_flat_cache_init
,
1525 .exit
= snd_soc_flat_cache_exit
,
1526 .read
= snd_soc_flat_cache_read
,
1527 .write
= snd_soc_flat_cache_write
,
1528 .sync
= snd_soc_flat_cache_sync
1531 .id
= SND_SOC_LZO_COMPRESSION
,
1532 .init
= snd_soc_lzo_cache_init
,
1533 .exit
= snd_soc_lzo_cache_exit
,
1534 .read
= snd_soc_lzo_cache_read
,
1535 .write
= snd_soc_lzo_cache_write
,
1536 .sync
= snd_soc_lzo_cache_sync
1539 .id
= SND_SOC_RBTREE_COMPRESSION
,
1540 .init
= snd_soc_rbtree_cache_init
,
1541 .exit
= snd_soc_rbtree_cache_exit
,
1542 .read
= snd_soc_rbtree_cache_read
,
1543 .write
= snd_soc_rbtree_cache_write
,
1544 .sync
= snd_soc_rbtree_cache_sync
1548 int snd_soc_cache_init(struct snd_soc_codec
*codec
)
1552 for (i
= 0; i
< ARRAY_SIZE(cache_types
); ++i
)
1553 if (cache_types
[i
].id
== codec
->compress_type
)
1555 if (i
== ARRAY_SIZE(cache_types
)) {
1556 dev_err(codec
->dev
, "Could not match compress type: %d\n",
1557 codec
->compress_type
);
1561 mutex_init(&codec
->cache_rw_mutex
);
1562 codec
->cache_ops
= &cache_types
[i
];
1564 if (codec
->cache_ops
->init
)
1565 return codec
->cache_ops
->init(codec
);
1570 * NOTE: keep in mind that this function might be called
1573 int snd_soc_cache_exit(struct snd_soc_codec
*codec
)
1575 if (codec
->cache_ops
&& codec
->cache_ops
->exit
)
1576 return codec
->cache_ops
->exit(codec
);
1581 * snd_soc_cache_read: Fetch the value of a given register from the cache.
1583 * @codec: CODEC to configure.
1584 * @reg: The register index.
1585 * @value: The value to be returned.
1587 int snd_soc_cache_read(struct snd_soc_codec
*codec
,
1588 unsigned int reg
, unsigned int *value
)
1592 mutex_lock(&codec
->cache_rw_mutex
);
1594 if (value
&& codec
->cache_ops
&& codec
->cache_ops
->read
) {
1595 ret
= codec
->cache_ops
->read(codec
, reg
, value
);
1596 mutex_unlock(&codec
->cache_rw_mutex
);
1600 mutex_unlock(&codec
->cache_rw_mutex
);
1603 EXPORT_SYMBOL_GPL(snd_soc_cache_read
);
1606 * snd_soc_cache_write: Set the value of a given register in the cache.
1608 * @codec: CODEC to configure.
1609 * @reg: The register index.
1610 * @value: The new register value.
1612 int snd_soc_cache_write(struct snd_soc_codec
*codec
,
1613 unsigned int reg
, unsigned int value
)
1617 mutex_lock(&codec
->cache_rw_mutex
);
1619 if (codec
->cache_ops
&& codec
->cache_ops
->write
) {
1620 ret
= codec
->cache_ops
->write(codec
, reg
, value
);
1621 mutex_unlock(&codec
->cache_rw_mutex
);
1625 mutex_unlock(&codec
->cache_rw_mutex
);
1628 EXPORT_SYMBOL_GPL(snd_soc_cache_write
);
1631 * snd_soc_cache_sync: Sync the register cache with the hardware.
1633 * @codec: CODEC to configure.
1635 * Any registers that should not be synced should be marked as
1636 * volatile. In general drivers can choose not to use the provided
1637 * syncing functionality if they so require.
1639 int snd_soc_cache_sync(struct snd_soc_codec
*codec
)
1643 if (!codec
->cache_sync
) {
1647 if (codec
->cache_ops
&& codec
->cache_ops
->sync
) {
1648 ret
= codec
->cache_ops
->sync(codec
);
1650 codec
->cache_sync
= 0;
1656 EXPORT_SYMBOL_GPL(snd_soc_cache_sync
);