aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/video/tlv320aic23b.c71
1 files changed, 13 insertions, 58 deletions
diff --git a/drivers/media/video/tlv320aic23b.c b/drivers/media/video/tlv320aic23b.c
index 76b2e96429d9..0282f385bbdf 100644
--- a/drivers/media/video/tlv320aic23b.c
+++ b/drivers/media/video/tlv320aic23b.c
@@ -31,6 +31,7 @@
31#include <linux/i2c-id.h> 31#include <linux/i2c-id.h>
32#include <linux/videodev.h> 32#include <linux/videodev.h>
33#include <media/v4l2-common.h> 33#include <media/v4l2-common.h>
34#include <media/v4l2-i2c-drv-legacy.h>
34 35
35MODULE_DESCRIPTION("tlv320aic23b driver"); 36MODULE_DESCRIPTION("tlv320aic23b driver");
36MODULE_AUTHOR("Scott Alfter, Ulf Eklund, Hans Verkuil"); 37MODULE_AUTHOR("Scott Alfter, Ulf Eklund, Hans Verkuil");
@@ -126,31 +127,18 @@ static int tlv320aic23b_command(struct i2c_client *client, unsigned int cmd,
126 * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1' 127 * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
127 */ 128 */
128 129
129static struct i2c_driver i2c_driver; 130static int tlv320aic23b_probe(struct i2c_client *client)
130
131static int tlv320aic23b_attach(struct i2c_adapter *adapter, int address, int kind)
132{ 131{
133 struct i2c_client *client;
134 struct tlv320aic23b_state *state; 132 struct tlv320aic23b_state *state;
135 133
136 /* Check if the adapter supports the needed features */ 134 /* Check if the adapter supports the needed features */
137 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) 135 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
138 return 0; 136 return 0;
139 137
140 client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL); 138 v4l_info(client, "chip found @ 0x%x (%s)\n", client->addr << 1, client->adapter->name);
141 if (client == 0)
142 return -ENOMEM;
143
144 client->addr = address;
145 client->adapter = adapter;
146 client->driver = &i2c_driver;
147 snprintf(client->name, sizeof(client->name) - 1, "tlv320aic23b");
148
149 v4l_info(client, "chip found @ 0x%x (%s)\n", address << 1, adapter->name);
150 139
151 state = kmalloc(sizeof(struct tlv320aic23b_state), GFP_KERNEL); 140 state = kmalloc(sizeof(struct tlv320aic23b_state), GFP_KERNEL);
152 if (state == NULL) { 141 if (state == NULL) {
153 kfree(client);
154 return -ENOMEM; 142 return -ENOMEM;
155 } 143 }
156 state->muted = 0; 144 state->muted = 0;
@@ -163,55 +151,22 @@ static int tlv320aic23b_attach(struct i2c_adapter *adapter, int address, int kin
163 tlv320aic23b_write(client, 0, 0x119); /* set gain on both channels to +3.0 dB */ 151 tlv320aic23b_write(client, 0, 0x119); /* set gain on both channels to +3.0 dB */
164 tlv320aic23b_write(client, 8, 0x000); /* set sample rate to 48 kHz */ 152 tlv320aic23b_write(client, 8, 0x000); /* set sample rate to 48 kHz */
165 tlv320aic23b_write(client, 9, 0x001); /* activate digital interface */ 153 tlv320aic23b_write(client, 9, 0x001); /* activate digital interface */
166
167 i2c_attach_client(client);
168
169 return 0; 154 return 0;
170} 155}
171 156
172static int tlv320aic23b_probe(struct i2c_adapter *adapter) 157static int tlv320aic23b_remove(struct i2c_client *client)
173{ 158{
174 if (adapter->class & I2C_CLASS_TV_ANALOG) 159 kfree(i2c_get_clientdata(client));
175 return i2c_probe(adapter, &addr_data, tlv320aic23b_attach);
176 return 0;
177}
178
179static int tlv320aic23b_detach(struct i2c_client *client)
180{
181 int err;
182
183 err = i2c_detach_client(client);
184 if (err) {
185 return err;
186 }
187 kfree(client);
188
189 return 0; 160 return 0;
190} 161}
191 162
192/* ----------------------------------------------------------------------- */ 163/* ----------------------------------------------------------------------- */
193 164
194/* i2c implementation */
195static struct i2c_driver i2c_driver = {
196 .driver = {
197 .name = "tlv320aic23b",
198 },
199 .id = I2C_DRIVERID_TLV320AIC23B,
200 .attach_adapter = tlv320aic23b_probe,
201 .detach_client = tlv320aic23b_detach,
202 .command = tlv320aic23b_command,
203};
204
205 165
206static int __init tlv320aic23b_init_module(void) 166static struct v4l2_i2c_driver_data v4l2_i2c_data = {
207{ 167 .name = "tlv320aic23b",
208 return i2c_add_driver(&i2c_driver); 168 .driverid = I2C_DRIVERID_TLV320AIC23B,
209} 169 .command = tlv320aic23b_command,
210 170 .probe = tlv320aic23b_probe,
211static void __exit tlv320aic23b_cleanup_module(void) 171 .remove = tlv320aic23b_remove,
212{ 172};
213 i2c_del_driver(&i2c_driver);
214}
215
216module_init(tlv320aic23b_init_module);
217module_exit(tlv320aic23b_cleanup_module);