uda1341.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. /*
  2. * Philips UDA1341 mixer device driver
  3. *
  4. * Copyright (c) 2000 Nicolas Pitre <nico@cam.org>
  5. *
  6. * Portions are Copyright (C) 2000 Lernout & Hauspie Speech Products, N.V.
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License.
  10. *
  11. * History:
  12. *
  13. * 2000-05-21 Nicolas Pitre Initial release.
  14. *
  15. * 2000-08-19 Erik Bunce More inline w/ OSS API and UDA1341 docs
  16. * including fixed AGC and audio source handling
  17. *
  18. * 2000-11-30 Nicolas Pitre - More mixer functionalities.
  19. *
  20. * 2001-06-03 Nicolas Pitre Made this file a separate module, based on
  21. * the former sa1100-uda1341.c driver.
  22. *
  23. * 2001-08-13 Russell King Re-written as part of the L3 interface
  24. */
  25. #include <linux/module.h>
  26. #include <linux/init.h>
  27. #include <linux/types.h>
  28. #include <linux/slab.h>
  29. #include <linux/errno.h>
  30. #include <linux/ioctl.h>
  31. #include <linux/soundcard.h>
  32. #include <linux/err.h>
  33. #include <linux/l3/l3.h>
  34. #include <linux/l3/uda1341.h>
  35. #include <asm/uaccess.h>
  36. #define DEF_VOLUME 65
  37. #ifdef CONFIG_SA1100_JORNADA720
  38. #define CONFIG_UDA1344
  39. #endif
  40. /*
  41. * UDA1341 L3 address and command types
  42. */
  43. #define UDA1341_L3ADDR 5
  44. #define UDA1341_DATA0 (UDA1341_L3ADDR << 2 | 0)
  45. #if !defined(CONFIG_UDA1344)
  46. #define UDA1341_DATA1 (UDA1341_L3ADDR << 2 | 1)
  47. #endif
  48. #define UDA1341_STATUS (UDA1341_L3ADDR << 2 | 2)
  49. struct uda1341_regs {
  50. unsigned char stat0;
  51. #define STAT0 0x00
  52. #if !defined(CONFIG_UDA1344)
  53. #define STAT0_RST (1 << 6)
  54. #endif
  55. #define STAT0_SC_MASK (3 << 4)
  56. #define STAT0_SC_512FS (0 << 4)
  57. #define STAT0_SC_384FS (1 << 4)
  58. #define STAT0_SC_256FS (2 << 4)
  59. #define STAT0_IF_MASK (7 << 1)
  60. #define STAT0_IF_I2S (0 << 1)
  61. #define STAT0_IF_LSB16 (1 << 1)
  62. #define STAT0_IF_LSB18 (2 << 1)
  63. #define STAT0_IF_LSB20 (3 << 1)
  64. #define STAT0_IF_MSB (4 << 1)
  65. #define STAT0_IF_LSB16MSB (5 << 1)
  66. #define STAT0_IF_LSB18MSB (6 << 1)
  67. #define STAT0_IF_LSB20MSB (7 << 1)
  68. #define STAT0_DC_FILTER (1 << 0)
  69. #if !defined(CONFIG_UDA1344)
  70. unsigned char stat1;
  71. #define STAT1 0x80
  72. #define STAT1_DAC_GAIN (1 << 6) /* gain of DAC */
  73. #define STAT1_ADC_GAIN (1 << 5) /* gain of ADC */
  74. #define STAT1_ADC_POL (1 << 4) /* polarity of ADC */
  75. #define STAT1_DAC_POL (1 << 3) /* polarity of DAC */
  76. #define STAT1_DBL_SPD (1 << 2) /* double speed playback */
  77. #define STAT1_ADC_ON (1 << 1) /* ADC powered */
  78. #define STAT1_DAC_ON (1 << 0) /* DAC powered */
  79. #endif
  80. unsigned char data0_0;
  81. #define DATA0 0x00
  82. #define DATA0_VOLUME_MASK 0x3f
  83. #define DATA0_VOLUME(x) (x)
  84. unsigned char data0_1;
  85. #define DATA1 0x40
  86. #define DATA1_BASS(x) ((x) << 2)
  87. #define DATA1_BASS_MASK (15 << 2)
  88. #define DATA1_TREBLE(x) ((x))
  89. #define DATA1_TREBLE_MASK (3)
  90. unsigned char data0_2;
  91. #define DATA2 0x80
  92. #if !defined(CONFIG_UDA1344)
  93. #define DATA2_PEAKAFTER (1 << 5)
  94. #endif
  95. #define DATA2_DEEMP_NONE (0 << 3)
  96. #define DATA2_DEEMP_32KHz (1 << 3)
  97. #define DATA2_DEEMP_44KHz (2 << 3)
  98. #define DATA2_DEEMP_48KHz (3 << 3)
  99. #define DATA2_MUTE (1 << 2)
  100. #define DATA2_FILTER_FLAT (0 << 0)
  101. #define DATA2_FILTER_MIN (1 << 0)
  102. #define DATA2_FILTER_MAX (3 << 0)
  103. #if defined(CONFIG_UDA1344)
  104. unsigned char data0_3;
  105. #define DATA3 0xc0
  106. #define DATA3_DAC_ON (0 << 0)
  107. #define DATA3_ADC_ON (1 << 0)
  108. #else
  109. #define EXTADDR(n) (0xc0 | (n))
  110. #define EXTDATA(d) (0xe0 | (d))
  111. unsigned char ext0;
  112. #define EXT0 0
  113. #define EXT0_CH1_GAIN(x) (x)
  114. unsigned char ext1;
  115. #define EXT1 1
  116. #define EXT1_CH2_GAIN(x) (x)
  117. unsigned char ext2;
  118. #define EXT2 2
  119. #define EXT2_MIC_GAIN_MASK (7 << 2)
  120. #define EXT2_MIC_GAIN(x) ((x) << 2)
  121. #define EXT2_MIXMODE_DOUBLEDIFF (0)
  122. #define EXT2_MIXMODE_CH1 (1)
  123. #define EXT2_MIXMODE_CH2 (2)
  124. #define EXT2_MIXMODE_MIX (3)
  125. unsigned char ext4;
  126. #define EXT4 4
  127. #define EXT4_AGC_ENABLE (1 << 4)
  128. #define EXT4_INPUT_GAIN_MASK (3)
  129. #define EXT4_INPUT_GAIN(x) ((x) & 3)
  130. unsigned char ext5;
  131. #define EXT5 5
  132. #define EXT5_INPUT_GAIN(x) ((x) >> 2)
  133. unsigned char ext6;
  134. #define EXT6 6
  135. #define EXT6_AGC_CONSTANT_MASK (7 << 2)
  136. #define EXT6_AGC_CONSTANT(x) ((x) << 2)
  137. #define EXT6_AGC_LEVEL_MASK (3)
  138. #define EXT6_AGC_LEVEL(x) (x)
  139. #endif
  140. };
  141. #define REC_MASK (SOUND_MASK_LINE | SOUND_MASK_MIC)
  142. #define DEV_MASK (REC_MASK | SOUND_MASK_VOLUME | SOUND_MASK_BASS | SOUND_MASK_TREBLE)
  143. struct uda1341 {
  144. struct l3_adapter *l3_bus;
  145. struct uda1341_regs regs;
  146. int active;
  147. unsigned short volume;
  148. unsigned short bass;
  149. unsigned short treble;
  150. unsigned short line;
  151. unsigned short mic;
  152. int mod_cnt;
  153. };
  154. #define ADD_FIELD(reg,field) \
  155. *p++ = reg | uda->regs.field
  156. #if !defined(CONFIG_UDA1344)
  157. #define ADD_EXTFIELD(reg,field) \
  158. *p++ = EXTADDR(reg); \
  159. *p++ = EXTDATA(uda->regs.field);
  160. #endif
  161. static void uda1341_sync(struct uda1341 *uda)
  162. {
  163. char buf[24], *p = buf;
  164. ADD_FIELD(STAT0, stat0);
  165. #if !defined(CONFIG_UDA1344)
  166. ADD_FIELD(STAT1, stat1);
  167. #endif
  168. if (p != buf)
  169. l3_write(uda->l3_bus, UDA1341_STATUS, buf, p - buf);
  170. p = buf;
  171. ADD_FIELD(DATA0, data0_0);
  172. ADD_FIELD(DATA1, data0_1);
  173. ADD_FIELD(DATA2, data0_2);
  174. #if defined(CONFIG_UDA1344)
  175. ADD_FIELD(DATA3, data0_3);
  176. #else
  177. ADD_EXTFIELD(EXT0, ext0);
  178. ADD_EXTFIELD(EXT1, ext1);
  179. ADD_EXTFIELD(EXT2, ext2);
  180. ADD_EXTFIELD(EXT4, ext4);
  181. ADD_EXTFIELD(EXT5, ext5);
  182. ADD_EXTFIELD(EXT6, ext6);
  183. #endif
  184. if (p != buf)
  185. l3_write(uda->l3_bus, UDA1341_DATA0, buf, p - buf);
  186. }
  187. int uda1341_configure(struct uda1341 *uda, struct uda1341_cfg *conf)
  188. {
  189. int ret = 0;
  190. uda->regs.stat0 &= ~(STAT0_SC_MASK | STAT0_IF_MASK);
  191. switch (conf->fs) {
  192. case 512: uda->regs.stat0 |= STAT0_SC_512FS; break;
  193. case 384: uda->regs.stat0 |= STAT0_SC_384FS; break;
  194. case 256: uda->regs.stat0 |= STAT0_SC_256FS; break;
  195. default: ret = -EINVAL; break;
  196. }
  197. switch (conf->format) {
  198. case FMT_I2S: uda->regs.stat0 |= STAT0_IF_I2S; break;
  199. case FMT_LSB16: uda->regs.stat0 |= STAT0_IF_LSB16; break;
  200. case FMT_LSB18: uda->regs.stat0 |= STAT0_IF_LSB18; break;
  201. case FMT_LSB20: uda->regs.stat0 |= STAT0_IF_LSB20; break;
  202. case FMT_MSB: uda->regs.stat0 |= STAT0_IF_MSB; break;
  203. case FMT_LSB16MSB: uda->regs.stat0 |= STAT0_IF_LSB16MSB; break;
  204. case FMT_LSB18MSB: uda->regs.stat0 |= STAT0_IF_LSB18MSB; break;
  205. case FMT_LSB20MSB: uda->regs.stat0 |= STAT0_IF_LSB20MSB; break;
  206. }
  207. if (ret == 0 && uda->active) {
  208. char buf = uda->regs.stat0 | STAT0;
  209. l3_write(uda->l3_bus, UDA1341_STATUS, &buf, 1);
  210. }
  211. return ret;
  212. }
  213. static int uda1341_update_direct(struct uda1341 *uda, int cmd, void *arg)
  214. {
  215. struct l3_gain *v = arg;
  216. char newreg;
  217. int val;
  218. switch (cmd) {
  219. case L3_SET_VOLUME: /* set volume. val = 0 to 100 => 62 to 1 */
  220. uda->regs.data0_0 = DATA0_VOLUME(62 - ((v->left * 61) / 100));
  221. newreg = uda->regs.data0_0 | DATA0;
  222. break;
  223. case L3_SET_BASS: /* set bass. val = 50 to 100 => 0 to 12 */
  224. val = v->left - 50;
  225. if (val < 0)
  226. val = 0;
  227. uda->regs.data0_1 &= ~DATA1_BASS_MASK;
  228. uda->regs.data0_1 |= DATA1_BASS((val * 12) / 50);
  229. newreg = uda->regs.data0_1 | DATA1;
  230. break;
  231. case L3_SET_TREBLE: /* set treble. val = 50 to 100 => 0 to 3 */
  232. val = v->left - 50;
  233. if (val < 0)
  234. val = 0;
  235. uda->regs.data0_1 &= ~DATA1_TREBLE_MASK;
  236. uda->regs.data0_1 |= DATA1_TREBLE((val * 3) / 50);
  237. newreg = uda->regs.data0_1 | DATA1;
  238. break;
  239. default:
  240. return -EINVAL;
  241. }
  242. if (uda->active)
  243. l3_write(uda->l3_bus, UDA1341_DATA0, &newreg, 1);
  244. return 0;
  245. }
  246. #if !defined(CONFIG_UDA1344)
  247. static int uda1341_update_indirect(struct uda1341 *uda, int cmd, void *arg)
  248. {
  249. struct l3_gain *gain = arg;
  250. struct l3_agc *agc = arg;
  251. char buf[8], *p = buf;
  252. int val, ret = 0;
  253. switch (cmd) {
  254. case L3_SET_GAIN:
  255. val = 31 - (gain->left * 31 / 100);
  256. switch (gain->channel) {
  257. case 1:
  258. uda->regs.ext0 = EXT0_CH1_GAIN(val);
  259. ADD_EXTFIELD(EXT0, ext0);
  260. break;
  261. case 2:
  262. uda->regs.ext1 = EXT1_CH2_GAIN(val);
  263. ADD_EXTFIELD(EXT1, ext1);
  264. break;
  265. default:
  266. ret = -EINVAL;
  267. }
  268. break;
  269. case L3_INPUT_AGC:
  270. if (agc->channel == 2) {
  271. if (agc->enable)
  272. uda->regs.ext4 |= EXT4_AGC_ENABLE;
  273. else
  274. uda->regs.ext4 &= ~EXT4_AGC_ENABLE;
  275. #if 0
  276. agc->level
  277. agc->attack
  278. agc->decay
  279. #endif
  280. ADD_EXTFIELD(EXT4, ext4);
  281. } else
  282. ret = -EINVAL;
  283. break;
  284. default:
  285. ret = -EINVAL;
  286. break;
  287. }
  288. if (ret == 0 && uda->active)
  289. l3_write(uda->l3_bus, UDA1341_DATA0, buf, p - buf);
  290. return ret;
  291. }
  292. #endif
  293. static int uda1341_mixer_ioctl(struct uda1341 *uda, int cmd, void *arg)
  294. {
  295. struct l3_gain gain;
  296. int val, nr = _IOC_NR(cmd), ret = 0;
  297. printk("ioctl %x\n",cmd);
  298. if (cmd == SOUND_MIXER_INFO) {
  299. struct mixer_info mi;
  300. strncpy(mi.id, "UDA1341", sizeof(mi.id));
  301. strncpy(mi.name, "Philips UDA1341", sizeof(mi.name));
  302. mi.modify_counter = uda->mod_cnt;
  303. return copy_to_user(arg, &mi, sizeof(mi)) ? -EFAULT : 0;
  304. }
  305. if (_IOC_DIR(cmd) & _IOC_WRITE) {
  306. ret = get_user(val, (int *)arg);
  307. if (ret)
  308. goto out;
  309. gain.left = val & 255;
  310. gain.right = val >> 8;
  311. gain.channel = 0;
  312. switch (nr) {
  313. case SOUND_MIXER_VOLUME:
  314. uda->volume = val;
  315. uda->mod_cnt++;
  316. uda1341_update_direct(uda, L3_SET_VOLUME, &gain);
  317. break;
  318. case SOUND_MIXER_BASS:
  319. uda->bass = val;
  320. uda->mod_cnt++;
  321. uda1341_update_direct(uda, L3_SET_BASS, &gain);
  322. break;
  323. case SOUND_MIXER_TREBLE:
  324. uda->treble = val;
  325. uda->mod_cnt++;
  326. uda1341_update_direct(uda, L3_SET_TREBLE, &gain);
  327. break;
  328. case SOUND_MIXER_LINE:
  329. #if defined(CONFIG_UDA1344)
  330. ret = -EINVAL;
  331. #else
  332. uda->line = val;
  333. gain.channel = 1;
  334. uda->mod_cnt++;
  335. uda1341_update_indirect(uda, L3_SET_GAIN, &gain);
  336. #endif
  337. break;
  338. case SOUND_MIXER_MIC:
  339. #if defined(CONFIG_UDA1344)
  340. ret= -EINVAL;
  341. #else
  342. uda->mic = val;
  343. gain.channel = 2;
  344. uda->mod_cnt++;
  345. uda1341_update_indirect(uda, L3_SET_GAIN, &gain);
  346. #endif
  347. break;
  348. case SOUND_MIXER_RECSRC:
  349. break;
  350. default:
  351. ret = -EINVAL;
  352. }
  353. }
  354. if (ret == 0 && _IOC_DIR(cmd) & _IOC_READ) {
  355. int nr = _IOC_NR(cmd);
  356. ret = 0;
  357. switch (nr) {
  358. case SOUND_MIXER_VOLUME: val = uda->volume; break;
  359. case SOUND_MIXER_BASS: val = uda->bass; break;
  360. case SOUND_MIXER_TREBLE: val = uda->treble; break;
  361. case SOUND_MIXER_LINE: val = uda->line; break;
  362. case SOUND_MIXER_MIC: val = uda->mic; break;
  363. case SOUND_MIXER_RECSRC: val = REC_MASK; break;
  364. case SOUND_MIXER_RECMASK: val = REC_MASK; break;
  365. case SOUND_MIXER_DEVMASK: val = DEV_MASK; break;
  366. case SOUND_MIXER_CAPS: val = 0; break;
  367. case SOUND_MIXER_STEREODEVS: val = 0; break;
  368. default: val = 0; ret = -EINVAL; break;
  369. }
  370. if (ret == 0)
  371. ret = put_user(val, (int *)arg);
  372. }
  373. out:
  374. return ret;
  375. }
  376. struct uda1341 *uda1341_attach(const char *adapter)
  377. {
  378. struct uda1341 *uda;
  379. uda = kmalloc(sizeof(*uda), GFP_KERNEL);
  380. if (!uda)
  381. return ERR_PTR(-ENOMEM);
  382. memset(uda, 0, sizeof(*uda));
  383. uda->volume = DEF_VOLUME | DEF_VOLUME << 8;
  384. uda->bass = 50 | 50 << 8;
  385. uda->treble = 50 | 50 << 8;
  386. uda->line = 88 | 88 << 8;
  387. uda->mic = 88 | 88 << 8;
  388. //uda->regs.stat0 = STAT0_SC_256FS | STAT0_IF_LSB16;
  389. uda->regs.stat0 = STAT0_SC_384FS | STAT0_IF_I2S;
  390. #if !defined(CONFIG_UDA1344)
  391. uda->regs.stat1 = STAT1_DAC_GAIN | STAT1_ADC_GAIN |
  392. STAT1_ADC_ON | STAT1_DAC_ON;
  393. #endif
  394. uda->regs.data0_0 = DATA0_VOLUME(62 - ((DEF_VOLUME * 61) / 100));
  395. uda->regs.data0_1 = DATA1_BASS(0) | DATA1_TREBLE(0);
  396. #if defined(CONFIG_UDA1344)
  397. uda->regs.data0_2 = DATA2_DEEMP_NONE | DATA2_FILTER_MAX;
  398. uda->regs.data0_3 = DATA3_ADC_ON | DATA3_DAC_ON;
  399. #else
  400. uda->regs.data0_2 = DATA2_PEAKAFTER | DATA2_DEEMP_NONE |
  401. DATA2_FILTER_MAX;
  402. uda->regs.ext0 = EXT0_CH1_GAIN(4);
  403. uda->regs.ext1 = EXT1_CH2_GAIN(4);
  404. uda->regs.ext2 = EXT2_MIXMODE_MIX | EXT2_MIC_GAIN(4);
  405. uda->regs.ext4 = EXT4_AGC_ENABLE | EXT4_INPUT_GAIN(0);
  406. uda->regs.ext5 = EXT5_INPUT_GAIN(0);
  407. uda->regs.ext6 = EXT6_AGC_CONSTANT(3) | EXT6_AGC_LEVEL(0);
  408. #endif
  409. uda->l3_bus = l3_get_adapter(adapter);
  410. if (!uda->l3_bus) {
  411. kfree(uda);
  412. uda = ERR_PTR(-ENOENT);
  413. }
  414. return uda;
  415. }
  416. void uda1341_detach(struct uda1341 *uda)
  417. {
  418. l3_put_adapter(uda->l3_bus);
  419. kfree(uda);
  420. }
  421. int uda1341_mixer_ctl(struct uda1341 *uda, int cmd, void *arg)
  422. {
  423. int ret = -EINVAL;
  424. if (_IOC_TYPE(cmd) == 'M')
  425. ret = uda1341_mixer_ioctl(uda, cmd, arg);
  426. return ret;
  427. }
  428. int uda1341_open(struct uda1341 *uda)
  429. {
  430. char buf[2];
  431. uda->active = 1;
  432. #if defined(CONFIG_UDA1344)
  433. buf[0] = uda->regs.stat0;
  434. buf[1] = uda->regs.stat0;
  435. #else
  436. buf[0] = uda->regs.stat0 | STAT0_RST;
  437. buf[1] = uda->regs.stat0;
  438. #endif
  439. l3_write(uda->l3_bus, UDA1341_STATUS, buf, 2);
  440. /* resend all parameters */
  441. uda1341_sync(uda);
  442. return 0;
  443. }
  444. void uda1341_close(struct uda1341 *uda)
  445. {
  446. uda->active = 0;
  447. }
  448. MODULE_AUTHOR("Nicolas Pitre");
  449. MODULE_DESCRIPTION("Philips UDA1341 CODEC driver");