28 #include <linux/module.h>
29 #include <linux/types.h>
30 #include <linux/slab.h>
32 #include <asm/uaccess.h>
33 #include <linux/i2c.h>
34 #include <linux/videodev2.h>
50 R12,
R13,
R14,
R15,
R16,
R17,
R18,
R19,
R20,
R21,
R23 = 23,
83 v4l2_err(sd,
"Invalid register R%d\n", reg);
87 for (i = 0; i < 3; i++)
89 (reg << 1) | (val >> 8), val & 0xff) == 0)
91 v4l2_err(sd,
"I2C: cannot write %03x to register R%d\n", val, reg);
95 static void wm8775_set_audio(
struct v4l2_subdev *sd,
int quietly)
99 int muted = 0 != state->
mute->val;
104 vol_l = (
min(65536 - balance, 32768) *
volume) >> 23;
108 if (muted || quietly)
109 wm8775_write(sd,
R21, 0x0c0 | state->
input);
111 wm8775_write(sd,
R14, vol_l | 0x100);
112 wm8775_write(sd,
R15, vol_r | 0x100);
116 wm8775_write(sd,
R21, state->
input);
119 static int wm8775_s_routing(
struct v4l2_subdev *sd,
130 v4l2_err(sd,
"Invalid input %d.\n", input);
140 wm8775_set_audio(sd, 1);
152 wm8775_set_audio(sd, 0);
163 struct i2c_client *client = v4l2_get_subdevdata(sd);
168 static int wm8775_log_status(
struct v4l2_subdev *sd)
179 wm8775_set_audio(sd, 0);
190 .log_status = wm8775_log_status,
191 .g_chip_ident = wm8775_g_chip_ident,
202 .s_frequency = wm8775_s_frequency,
206 .s_routing = wm8775_s_routing,
210 .core = &wm8775_core_ops,
211 .tuner = &wm8775_tuner_ops,
212 .audio = &wm8775_audio_ops,
224 static int wm8775_probe(
struct i2c_client *client,
230 bool is_nova_s =
false;
232 if (client->
dev.platform_data) {
241 v4l_info(client,
"chip found @ 0x%02x (%s)\n",
261 err = state->
hdl.error;
271 wm8775_write(sd,
R23, 0x000);
273 wm8775_write(sd,
R7, 0x000);
275 wm8775_write(sd,
R11, 0x021);
277 wm8775_write(sd,
R12, 0x102);
279 wm8775_write(sd,
R13, 0x000);
283 wm8775_write(sd,
R14, 0x1d4);
285 wm8775_write(sd,
R15, 0x1d4);
287 wm8775_write(sd,
R16, 0x1bf);
290 wm8775_write(sd,
R17, 0x185);
293 wm8775_write(sd,
R16, 0x1bb);
298 wm8775_write(sd,
R18, 0x0a2);
300 wm8775_write(sd,
R19, 0x005);
303 wm8775_write(sd,
R20, 0x07a);
305 wm8775_write(sd,
R21, 0x102);
308 wm8775_write(sd,
R20, 0x0fb);
310 wm8775_set_audio(sd, 1);
315 static int wm8775_remove(
struct i2c_client *client)
317 struct v4l2_subdev *sd = i2c_get_clientdata(client);
337 .probe = wm8775_probe,
338 .remove = wm8775_remove,
339 .id_table = wm8775_id,