1 static int smdk2410_mixer_ioctl(struct inode *inode, struct file *file,
2 unsigned int cmd, unsigned long arg)
3 {
4 int ret;
5 long val = 0;
6
7 switch (cmd) {
8 case SOUND_MIXER_INFO:
9 {
10 mixer_info info;
11 strncpy(info.id, "UDA1341", sizeof(info.id));
12 strncpy(info.name,"Philips UDA1341", sizeof(info.name));
13 info.modify_counter = audio_mix_modcnt;
14 return copy_to_user((void *)arg, &info, sizeof(info));
15 }
16
17 case SOUND_OLD_MIXER_INFO:
18 {
19 _old_mixer_info info;
20 strncpy(info.id, "UDA1341", sizeof(info.id));
21 strncpy(info.name,"Philips UDA1341", sizeof(info.name));
22 return copy_to_user((void *)arg, &info, sizeof(info));
23 }
24
25 case SOUND_MIXER_READ_STEREODEVS:
26 return put_user(0, (long *) arg);
27
28 case SOUND_MIXER_READ_CAPS:
29 val = SOUND_CAP_EXCL_INPUT;
30 return put_user(val, (long *) arg);
31
32 case SOUND_MIXER_WRITE_VOLUME:
33 ret = get_user(val, (long *) arg);
34 if (ret)
35 return ret;
36
37 /* ioctl: val越大表示音量越大, 0-最小, 100-最大
38 * UDA1341: 寄存器的值越小音量越大
39 * WM8976: 52,53号寄存器bit[5:0]表示音量, 值越大音量越大, 0-63
40 */
41
42 uda1341_volume = (((val & 0xff) + 1) * 63) / 100;
43 wm8976_write_reg(52, (1<<8)|uda1341_volume);
44 wm8976_write_reg(53, (1<<8)|uda1341_volume);
45 //uda1341_l3_address(UDA1341_REG_DATA0);
46 //uda1341_l3_data(uda1341_volume);
47 break;
48
49 case SOUND_MIXER_READ_VOLUME:
50 val = (uda1341_volume * 100) / 63;
51 return put_user(val, (long *) arg);
52
53 case SOUND_MIXER_READ_IGAIN:
54 val = ((31- mixer_igain) * 100) / 31;
55 return put_user(val, (int *) arg);
56
57 case SOUND_MIXER_WRITE_IGAIN:
58 ret = get_user(val, (int *) arg);
59 if (ret)
60 return ret;
61 mixer_igain = 31 - (val * 31 / 100);
62 /* use mixer gain channel 1*/
63 //uda1341_l3_address(UDA1341_REG_DATA0);
64 //uda1341_l3_data(EXTADDR(EXT0));
65 //uda1341_l3_data(EXTDATA(EXT0_CH1_GAIN(mixer_igain)));
66 break;
67
68 default:
69 DPRINTK("mixer ioctl %u unknown\n", cmd);
70 return -ENOSYS;
71 }
72
73 audio_mix_modcnt++;
74 return 0;
75 }