2 * Load Analog Devices SigmaStudio firmware files
4 * Copyright 2009-2011 Analog Devices Inc.
6 * Licensed under the GPL-2 or later.
9 #include <linux/export.h>
10 #include <linux/i2c.h>
11 #include <linux/module.h>
12 #include <linux/slab.h>
13 #include <asm/unaligned.h>
17 static int sigmadsp_write_i2c(void *control_data
,
18 unsigned int addr
, const uint8_t data
[], size_t len
)
23 buf
= kzalloc(2 + len
, GFP_KERNEL
| GFP_DMA
);
27 put_unaligned_be16(addr
, buf
);
28 memcpy(buf
+ 2, data
, len
);
30 ret
= i2c_master_send(control_data
, buf
, len
+ 2);
40 static int sigmadsp_read_i2c(void *control_data
,
41 unsigned int addr
, uint8_t data
[], size_t len
)
43 struct i2c_client
*client
= control_data
;
44 struct i2c_msg msgs
[2];
48 put_unaligned_be16(addr
, buf
);
50 msgs
[0].addr
= client
->addr
;
51 msgs
[0].len
= sizeof(buf
);
55 msgs
[1].addr
= client
->addr
;
58 msgs
[1].flags
= I2C_M_RD
;
60 ret
= i2c_transfer(client
->adapter
, msgs
, ARRAY_SIZE(msgs
));
63 else if (ret
!= ARRAY_SIZE(msgs
))
69 * devm_sigmadsp_init_i2c() - Initialize SigmaDSP instance
70 * @client: The parent I2C device
71 * @ops: The sigmadsp_ops to use for this instance
72 * @firmware_name: Name of the firmware file to load
74 * Allocates a SigmaDSP instance and loads the specified firmware file.
76 * Returns a pointer to a struct sigmadsp on success, or a PTR_ERR() on error.
78 struct sigmadsp
*devm_sigmadsp_init_i2c(struct i2c_client
*client
,
79 const struct sigmadsp_ops
*ops
, const char *firmware_name
)
81 struct sigmadsp
*sigmadsp
;
83 sigmadsp
= devm_sigmadsp_init(&client
->dev
, ops
, firmware_name
);
87 sigmadsp
->control_data
= client
;
88 sigmadsp
->write
= sigmadsp_write_i2c
;
89 sigmadsp
->read
= sigmadsp_read_i2c
;
93 EXPORT_SYMBOL_GPL(devm_sigmadsp_init_i2c
);
95 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
96 MODULE_DESCRIPTION("SigmaDSP I2C firmware loader");
97 MODULE_LICENSE("GPL");