2 * soc-io.c -- ASoC register I/O helpers
4 * Copyright 2009-2011 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>
18 #include <trace/events/asoc.h>
20 #ifdef CONFIG_SPI_MASTER
21 static int do_spi_write(void *control
, const char *data
, int len
)
23 struct spi_device
*spi
= control
;
26 ret
= spi_write(spi
, data
, len
);
34 static int do_hw_write(struct snd_soc_codec
*codec
, unsigned int reg
,
35 unsigned int value
, const void *data
, int len
)
39 if (!snd_soc_codec_volatile_register(codec
, reg
) &&
40 reg
< codec
->driver
->reg_cache_size
&&
41 !codec
->cache_bypass
) {
42 ret
= snd_soc_cache_write(codec
, reg
, value
);
47 if (codec
->cache_only
) {
48 codec
->cache_sync
= 1;
52 ret
= codec
->hw_write(codec
->control_data
, data
, len
);
61 static unsigned int hw_read(struct snd_soc_codec
*codec
, unsigned int reg
)
66 if (reg
>= codec
->driver
->reg_cache_size
||
67 snd_soc_codec_volatile_register(codec
, reg
) ||
68 codec
->cache_bypass
) {
69 if (codec
->cache_only
)
72 BUG_ON(!codec
->hw_read
);
73 return codec
->hw_read(codec
, reg
);
76 ret
= snd_soc_cache_read(codec
, reg
, &val
);
82 static int snd_soc_4_12_write(struct snd_soc_codec
*codec
, unsigned int reg
,
87 data
= cpu_to_be16((reg
<< 12) | (value
& 0xffffff));
89 return do_hw_write(codec
, reg
, value
, &data
, 2);
92 static int snd_soc_7_9_write(struct snd_soc_codec
*codec
, unsigned int reg
,
97 data
= cpu_to_be16((reg
<< 9) | (value
& 0x1ff));
99 return do_hw_write(codec
, reg
, value
, &data
, 2);
102 static int snd_soc_8_8_write(struct snd_soc_codec
*codec
, unsigned int reg
,
109 data
[1] = value
& 0xff;
111 return do_hw_write(codec
, reg
, value
, data
, 2);
114 static int snd_soc_8_16_write(struct snd_soc_codec
*codec
, unsigned int reg
,
118 u16 val
= cpu_to_be16(value
);
121 memcpy(&data
[1], &val
, sizeof(val
));
123 return do_hw_write(codec
, reg
, value
, data
, 3);
126 #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
127 static unsigned int do_i2c_read(struct snd_soc_codec
*codec
,
128 void *reg
, int reglen
,
129 void *data
, int datalen
)
131 struct i2c_msg xfer
[2];
133 struct i2c_client
*client
= codec
->control_data
;
136 xfer
[0].addr
= client
->addr
;
138 xfer
[0].len
= reglen
;
142 xfer
[1].addr
= client
->addr
;
143 xfer
[1].flags
= I2C_M_RD
;
144 xfer
[1].len
= datalen
;
147 ret
= i2c_transfer(client
->adapter
, xfer
, 2);
157 #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
158 static unsigned int snd_soc_8_8_read_i2c(struct snd_soc_codec
*codec
,
165 ret
= do_i2c_read(codec
, ®
, 1, &data
, 1);
171 #define snd_soc_8_8_read_i2c NULL
174 #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
175 static unsigned int snd_soc_8_16_read_i2c(struct snd_soc_codec
*codec
,
182 ret
= do_i2c_read(codec
, ®
, 1, &data
, 2);
185 return (data
>> 8) | ((data
& 0xff) << 8);
188 #define snd_soc_8_16_read_i2c NULL
191 #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
192 static unsigned int snd_soc_16_8_read_i2c(struct snd_soc_codec
*codec
,
199 ret
= do_i2c_read(codec
, ®
, 2, &data
, 1);
205 #define snd_soc_16_8_read_i2c NULL
208 static int snd_soc_16_8_write(struct snd_soc_codec
*codec
, unsigned int reg
,
212 u16 rval
= cpu_to_be16(reg
);
214 memcpy(data
, &rval
, sizeof(rval
));
217 return do_hw_write(codec
, reg
, value
, data
, 3);
220 #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
221 static unsigned int snd_soc_16_16_read_i2c(struct snd_soc_codec
*codec
,
224 u16 reg
= cpu_to_be16(r
);
228 ret
= do_i2c_read(codec
, ®
, 2, &data
, 2);
231 return be16_to_cpu(data
);
234 #define snd_soc_16_16_read_i2c NULL
237 static int snd_soc_16_16_write(struct snd_soc_codec
*codec
, unsigned int reg
,
242 data
[0] = cpu_to_be16(reg
);
243 data
[1] = cpu_to_be16(value
);
245 return do_hw_write(codec
, reg
, value
, data
, sizeof(data
));
248 /* Primitive bulk write support for soc-cache. The data pointed to by
249 * `data' needs to already be in the form the hardware expects
250 * including any leading register specific data. Any data written
251 * through this function will not go through the cache as it only
252 * handles writing to volatile or out of bounds registers.
254 static int snd_soc_hw_bulk_write_raw(struct snd_soc_codec
*codec
, unsigned int reg
,
255 const void *data
, size_t len
)
259 /* To ensure that we don't get out of sync with the cache, check
260 * whether the base register is volatile or if we've directly asked
261 * to bypass the cache. Out of bounds registers are considered
264 if (!codec
->cache_bypass
265 && !snd_soc_codec_volatile_register(codec
, reg
)
266 && reg
< codec
->driver
->reg_cache_size
)
269 switch (codec
->control_type
) {
270 #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
272 ret
= i2c_master_send(to_i2c_client(codec
->dev
), data
, len
);
275 #if defined(CONFIG_SPI_MASTER)
277 ret
= spi_write(to_spi_device(codec
->dev
), data
, len
);
295 int (*write
)(struct snd_soc_codec
*codec
, unsigned int, unsigned int);
296 unsigned int (*read
)(struct snd_soc_codec
*, unsigned int);
297 unsigned int (*i2c_read
)(struct snd_soc_codec
*, unsigned int);
300 .addr_bits
= 4, .data_bits
= 12,
301 .write
= snd_soc_4_12_write
,
304 .addr_bits
= 7, .data_bits
= 9,
305 .write
= snd_soc_7_9_write
,
308 .addr_bits
= 8, .data_bits
= 8,
309 .write
= snd_soc_8_8_write
,
310 .i2c_read
= snd_soc_8_8_read_i2c
,
313 .addr_bits
= 8, .data_bits
= 16,
314 .write
= snd_soc_8_16_write
,
315 .i2c_read
= snd_soc_8_16_read_i2c
,
318 .addr_bits
= 16, .data_bits
= 8,
319 .write
= snd_soc_16_8_write
,
320 .i2c_read
= snd_soc_16_8_read_i2c
,
323 .addr_bits
= 16, .data_bits
= 16,
324 .write
= snd_soc_16_16_write
,
325 .i2c_read
= snd_soc_16_16_read_i2c
,
330 * snd_soc_codec_set_cache_io: Set up standard I/O functions.
332 * @codec: CODEC to configure.
333 * @addr_bits: Number of bits of register address data.
334 * @data_bits: Number of bits of data per register.
335 * @control: Control bus used.
337 * Register formats are frequently shared between many I2C and SPI
338 * devices. In order to promote code reuse the ASoC core provides
339 * some standard implementations of CODEC read and write operations
340 * which can be set up using this function.
342 * The caller is responsible for allocating and initialising the
345 * Note that at present this code cannot be used by CODECs with
346 * volatile registers.
348 int snd_soc_codec_set_cache_io(struct snd_soc_codec
*codec
,
349 int addr_bits
, int data_bits
,
350 enum snd_soc_control_type control
)
354 for (i
= 0; i
< ARRAY_SIZE(io_types
); i
++)
355 if (io_types
[i
].addr_bits
== addr_bits
&&
356 io_types
[i
].data_bits
== data_bits
)
358 if (i
== ARRAY_SIZE(io_types
)) {
360 "No I/O functions for %d bit address %d bit data\n",
361 addr_bits
, data_bits
);
365 codec
->write
= io_types
[i
].write
;
366 codec
->read
= hw_read
;
367 codec
->bulk_write_raw
= snd_soc_hw_bulk_write_raw
;
371 #if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE))
372 codec
->hw_write
= (hw_write_t
)i2c_master_send
;
374 if (io_types
[i
].i2c_read
)
375 codec
->hw_read
= io_types
[i
].i2c_read
;
377 codec
->control_data
= container_of(codec
->dev
,
383 #ifdef CONFIG_SPI_MASTER
384 codec
->hw_write
= do_spi_write
;
387 codec
->control_data
= container_of(codec
->dev
,
395 EXPORT_SYMBOL_GPL(snd_soc_codec_set_cache_io
);