mts64.c 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * ALSA Driver for Ego Systems Inc. (ESI) Miditerminal 4140
  4. * Copyright (c) 2006 by Matthias König <mk@phasorlab.de>
  5. */
  6. #include <linux/init.h>
  7. #include <linux/platform_device.h>
  8. #include <linux/parport.h>
  9. #include <linux/spinlock.h>
  10. #include <linux/module.h>
  11. #include <linux/delay.h>
  12. #include <linux/slab.h>
  13. #include <sound/core.h>
  14. #include <sound/initval.h>
  15. #include <sound/rawmidi.h>
  16. #include <sound/control.h>
  17. #define CARD_NAME "Miditerminal 4140"
  18. #define DRIVER_NAME "MTS64"
  19. #define PLATFORM_DRIVER "snd_mts64"
  20. static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
  21. static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
  22. static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
  23. static struct platform_device *platform_devices[SNDRV_CARDS];
  24. static int device_count;
  25. module_param_array(index, int, NULL, 0444);
  26. MODULE_PARM_DESC(index, "Index value for " CARD_NAME " soundcard.");
  27. module_param_array(id, charp, NULL, 0444);
  28. MODULE_PARM_DESC(id, "ID string for " CARD_NAME " soundcard.");
  29. module_param_array(enable, bool, NULL, 0444);
  30. MODULE_PARM_DESC(enable, "Enable " CARD_NAME " soundcard.");
  31. MODULE_AUTHOR("Matthias Koenig <mk@phasorlab.de>");
  32. MODULE_DESCRIPTION("ESI Miditerminal 4140");
  33. MODULE_LICENSE("GPL");
  34. /*********************************************************************
  35. * Chip specific
  36. *********************************************************************/
  37. #define MTS64_NUM_INPUT_PORTS 5
  38. #define MTS64_NUM_OUTPUT_PORTS 4
  39. #define MTS64_SMPTE_SUBSTREAM 4
  40. struct mts64 {
  41. spinlock_t lock;
  42. struct snd_card *card;
  43. struct snd_rawmidi *rmidi;
  44. struct pardevice *pardev;
  45. int open_count;
  46. int current_midi_output_port;
  47. int current_midi_input_port;
  48. u8 mode[MTS64_NUM_INPUT_PORTS];
  49. struct snd_rawmidi_substream *midi_input_substream[MTS64_NUM_INPUT_PORTS];
  50. int smpte_switch;
  51. u8 time[4]; /* [0]=hh, [1]=mm, [2]=ss, [3]=ff */
  52. u8 fps;
  53. };
  54. static int snd_mts64_free(struct mts64 *mts)
  55. {
  56. kfree(mts);
  57. return 0;
  58. }
  59. static int snd_mts64_create(struct snd_card *card,
  60. struct pardevice *pardev,
  61. struct mts64 **rchip)
  62. {
  63. struct mts64 *mts;
  64. *rchip = NULL;
  65. mts = kzalloc(sizeof(struct mts64), GFP_KERNEL);
  66. if (mts == NULL)
  67. return -ENOMEM;
  68. /* Init chip specific data */
  69. spin_lock_init(&mts->lock);
  70. mts->card = card;
  71. mts->pardev = pardev;
  72. mts->current_midi_output_port = -1;
  73. mts->current_midi_input_port = -1;
  74. *rchip = mts;
  75. return 0;
  76. }
  77. /*********************************************************************
  78. * HW register related constants
  79. *********************************************************************/
  80. /* Status Bits */
  81. #define MTS64_STAT_BSY 0x80
  82. #define MTS64_STAT_BIT_SET 0x20 /* readout process, bit is set */
  83. #define MTS64_STAT_PORT 0x10 /* read byte is a port number */
  84. /* Control Bits */
  85. #define MTS64_CTL_READOUT 0x08 /* enable readout */
  86. #define MTS64_CTL_WRITE_CMD 0x06
  87. #define MTS64_CTL_WRITE_DATA 0x02
  88. #define MTS64_CTL_STROBE 0x01
  89. /* Command */
  90. #define MTS64_CMD_RESET 0xfe
  91. #define MTS64_CMD_PROBE 0x8f /* Used in probing procedure */
  92. #define MTS64_CMD_SMPTE_SET_TIME 0xe8
  93. #define MTS64_CMD_SMPTE_SET_FPS 0xee
  94. #define MTS64_CMD_SMPTE_STOP 0xef
  95. #define MTS64_CMD_SMPTE_FPS_24 0xe3
  96. #define MTS64_CMD_SMPTE_FPS_25 0xe2
  97. #define MTS64_CMD_SMPTE_FPS_2997 0xe4
  98. #define MTS64_CMD_SMPTE_FPS_30D 0xe1
  99. #define MTS64_CMD_SMPTE_FPS_30 0xe0
  100. #define MTS64_CMD_COM_OPEN 0xf8 /* setting the communication mode */
  101. #define MTS64_CMD_COM_CLOSE1 0xff /* clearing communication mode */
  102. #define MTS64_CMD_COM_CLOSE2 0xf5
  103. /*********************************************************************
  104. * Hardware specific functions
  105. *********************************************************************/
  106. static void mts64_enable_readout(struct parport *p);
  107. static void mts64_disable_readout(struct parport *p);
  108. static int mts64_device_ready(struct parport *p);
  109. static int mts64_device_init(struct parport *p);
  110. static int mts64_device_open(struct mts64 *mts);
  111. static int mts64_device_close(struct mts64 *mts);
  112. static u8 mts64_map_midi_input(u8 c);
  113. static int mts64_probe(struct parport *p);
  114. static u16 mts64_read(struct parport *p);
  115. static u8 mts64_read_char(struct parport *p);
  116. static void mts64_smpte_start(struct parport *p,
  117. u8 hours, u8 minutes,
  118. u8 seconds, u8 frames,
  119. u8 idx);
  120. static void mts64_smpte_stop(struct parport *p);
  121. static void mts64_write_command(struct parport *p, u8 c);
  122. static void mts64_write_data(struct parport *p, u8 c);
  123. static void mts64_write_midi(struct mts64 *mts, u8 c, int midiport);
  124. /* Enables the readout procedure
  125. *
  126. * Before we can read a midi byte from the device, we have to set
  127. * bit 3 of control port.
  128. */
  129. static void mts64_enable_readout(struct parport *p)
  130. {
  131. u8 c;
  132. c = parport_read_control(p);
  133. c |= MTS64_CTL_READOUT;
  134. parport_write_control(p, c);
  135. }
  136. /* Disables readout
  137. *
  138. * Readout is disabled by clearing bit 3 of control
  139. */
  140. static void mts64_disable_readout(struct parport *p)
  141. {
  142. u8 c;
  143. c = parport_read_control(p);
  144. c &= ~MTS64_CTL_READOUT;
  145. parport_write_control(p, c);
  146. }
  147. /* waits for device ready
  148. *
  149. * Checks if BUSY (Bit 7 of status) is clear
  150. * 1 device ready
  151. * 0 failure
  152. */
  153. static int mts64_device_ready(struct parport *p)
  154. {
  155. int i;
  156. u8 c;
  157. for (i = 0; i < 0xffff; ++i) {
  158. c = parport_read_status(p);
  159. c &= MTS64_STAT_BSY;
  160. if (c != 0)
  161. return 1;
  162. }
  163. return 0;
  164. }
  165. /* Init device (LED blinking startup magic)
  166. *
  167. * Returns:
  168. * 0 init ok
  169. * -EIO failure
  170. */
  171. static int mts64_device_init(struct parport *p)
  172. {
  173. int i;
  174. mts64_write_command(p, MTS64_CMD_RESET);
  175. for (i = 0; i < 64; ++i) {
  176. msleep(100);
  177. if (mts64_probe(p) == 0) {
  178. /* success */
  179. mts64_disable_readout(p);
  180. return 0;
  181. }
  182. }
  183. mts64_disable_readout(p);
  184. return -EIO;
  185. }
  186. /*
  187. * Opens the device (set communication mode)
  188. */
  189. static int mts64_device_open(struct mts64 *mts)
  190. {
  191. int i;
  192. struct parport *p = mts->pardev->port;
  193. for (i = 0; i < 5; ++i)
  194. mts64_write_command(p, MTS64_CMD_COM_OPEN);
  195. return 0;
  196. }
  197. /*
  198. * Close device (clear communication mode)
  199. */
  200. static int mts64_device_close(struct mts64 *mts)
  201. {
  202. int i;
  203. struct parport *p = mts->pardev->port;
  204. for (i = 0; i < 5; ++i) {
  205. mts64_write_command(p, MTS64_CMD_COM_CLOSE1);
  206. mts64_write_command(p, MTS64_CMD_COM_CLOSE2);
  207. }
  208. return 0;
  209. }
  210. /* map hardware port to substream number
  211. *
  212. * When reading a byte from the device, the device tells us
  213. * on what port the byte is. This HW port has to be mapped to
  214. * the midiport (substream number).
  215. * substream 0-3 are Midiports 1-4
  216. * substream 4 is SMPTE Timecode
  217. * The mapping is done by the table:
  218. * HW | 0 | 1 | 2 | 3 | 4
  219. * SW | 0 | 1 | 4 | 2 | 3
  220. */
  221. static u8 mts64_map_midi_input(u8 c)
  222. {
  223. static const u8 map[] = { 0, 1, 4, 2, 3 };
  224. return map[c];
  225. }
  226. /* Probe parport for device
  227. *
  228. * Do we have a Miditerminal 4140 on parport?
  229. * Returns:
  230. * 0 device found
  231. * -ENODEV no device
  232. */
  233. static int mts64_probe(struct parport *p)
  234. {
  235. u8 c;
  236. mts64_smpte_stop(p);
  237. mts64_write_command(p, MTS64_CMD_PROBE);
  238. msleep(50);
  239. c = mts64_read(p);
  240. c &= 0x00ff;
  241. if (c != MTS64_CMD_PROBE)
  242. return -ENODEV;
  243. else
  244. return 0;
  245. }
  246. /* Read byte incl. status from device
  247. *
  248. * Returns:
  249. * data in lower 8 bits and status in upper 8 bits
  250. */
  251. static u16 mts64_read(struct parport *p)
  252. {
  253. u8 data, status;
  254. mts64_device_ready(p);
  255. mts64_enable_readout(p);
  256. status = parport_read_status(p);
  257. data = mts64_read_char(p);
  258. mts64_disable_readout(p);
  259. return (status << 8) | data;
  260. }
  261. /* Read a byte from device
  262. *
  263. * Note, that readout mode has to be enabled.
  264. * readout procedure is as follows:
  265. * - Write number of the Bit to read to DATA
  266. * - Read STATUS
  267. * - Bit 5 of STATUS indicates if Bit is set
  268. *
  269. * Returns:
  270. * Byte read from device
  271. */
  272. static u8 mts64_read_char(struct parport *p)
  273. {
  274. u8 c = 0;
  275. u8 status;
  276. u8 i;
  277. for (i = 0; i < 8; ++i) {
  278. parport_write_data(p, i);
  279. c >>= 1;
  280. status = parport_read_status(p);
  281. if (status & MTS64_STAT_BIT_SET)
  282. c |= 0x80;
  283. }
  284. return c;
  285. }
  286. /* Starts SMPTE Timecode generation
  287. *
  288. * The device creates SMPTE Timecode by hardware.
  289. * 0 24 fps
  290. * 1 25 fps
  291. * 2 29.97 fps
  292. * 3 30 fps (Drop-frame)
  293. * 4 30 fps
  294. */
  295. static void mts64_smpte_start(struct parport *p,
  296. u8 hours, u8 minutes,
  297. u8 seconds, u8 frames,
  298. u8 idx)
  299. {
  300. static const u8 fps[5] = { MTS64_CMD_SMPTE_FPS_24,
  301. MTS64_CMD_SMPTE_FPS_25,
  302. MTS64_CMD_SMPTE_FPS_2997,
  303. MTS64_CMD_SMPTE_FPS_30D,
  304. MTS64_CMD_SMPTE_FPS_30 };
  305. mts64_write_command(p, MTS64_CMD_SMPTE_SET_TIME);
  306. mts64_write_command(p, frames);
  307. mts64_write_command(p, seconds);
  308. mts64_write_command(p, minutes);
  309. mts64_write_command(p, hours);
  310. mts64_write_command(p, MTS64_CMD_SMPTE_SET_FPS);
  311. mts64_write_command(p, fps[idx]);
  312. }
  313. /* Stops SMPTE Timecode generation
  314. */
  315. static void mts64_smpte_stop(struct parport *p)
  316. {
  317. mts64_write_command(p, MTS64_CMD_SMPTE_STOP);
  318. }
  319. /* Write a command byte to device
  320. */
  321. static void mts64_write_command(struct parport *p, u8 c)
  322. {
  323. mts64_device_ready(p);
  324. parport_write_data(p, c);
  325. parport_write_control(p, MTS64_CTL_WRITE_CMD);
  326. parport_write_control(p, MTS64_CTL_WRITE_CMD | MTS64_CTL_STROBE);
  327. parport_write_control(p, MTS64_CTL_WRITE_CMD);
  328. }
  329. /* Write a data byte to device
  330. */
  331. static void mts64_write_data(struct parport *p, u8 c)
  332. {
  333. mts64_device_ready(p);
  334. parport_write_data(p, c);
  335. parport_write_control(p, MTS64_CTL_WRITE_DATA);
  336. parport_write_control(p, MTS64_CTL_WRITE_DATA | MTS64_CTL_STROBE);
  337. parport_write_control(p, MTS64_CTL_WRITE_DATA);
  338. }
  339. /* Write a MIDI byte to midiport
  340. *
  341. * midiport ranges from 0-3 and maps to Ports 1-4
  342. * assumptions: communication mode is on
  343. */
  344. static void mts64_write_midi(struct mts64 *mts, u8 c,
  345. int midiport)
  346. {
  347. struct parport *p = mts->pardev->port;
  348. /* check current midiport */
  349. if (mts->current_midi_output_port != midiport)
  350. mts64_write_command(p, midiport);
  351. /* write midi byte */
  352. mts64_write_data(p, c);
  353. }
  354. /*********************************************************************
  355. * Control elements
  356. *********************************************************************/
  357. /* SMPTE Switch */
  358. #define snd_mts64_ctl_smpte_switch_info snd_ctl_boolean_mono_info
  359. static int snd_mts64_ctl_smpte_switch_get(struct snd_kcontrol* kctl,
  360. struct snd_ctl_elem_value *uctl)
  361. {
  362. struct mts64 *mts = snd_kcontrol_chip(kctl);
  363. spin_lock_irq(&mts->lock);
  364. uctl->value.integer.value[0] = mts->smpte_switch;
  365. spin_unlock_irq(&mts->lock);
  366. return 0;
  367. }
  368. /* smpte_switch is not accessed from IRQ handler, so we just need
  369. to protect the HW access */
  370. static int snd_mts64_ctl_smpte_switch_put(struct snd_kcontrol* kctl,
  371. struct snd_ctl_elem_value *uctl)
  372. {
  373. struct mts64 *mts = snd_kcontrol_chip(kctl);
  374. int changed = 0;
  375. int val = !!uctl->value.integer.value[0];
  376. spin_lock_irq(&mts->lock);
  377. if (mts->smpte_switch == val)
  378. goto __out;
  379. changed = 1;
  380. mts->smpte_switch = val;
  381. if (mts->smpte_switch) {
  382. mts64_smpte_start(mts->pardev->port,
  383. mts->time[0], mts->time[1],
  384. mts->time[2], mts->time[3],
  385. mts->fps);
  386. } else {
  387. mts64_smpte_stop(mts->pardev->port);
  388. }
  389. __out:
  390. spin_unlock_irq(&mts->lock);
  391. return changed;
  392. }
  393. static const struct snd_kcontrol_new mts64_ctl_smpte_switch = {
  394. .iface = SNDRV_CTL_ELEM_IFACE_RAWMIDI,
  395. .name = "SMPTE Playback Switch",
  396. .index = 0,
  397. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
  398. .private_value = 0,
  399. .info = snd_mts64_ctl_smpte_switch_info,
  400. .get = snd_mts64_ctl_smpte_switch_get,
  401. .put = snd_mts64_ctl_smpte_switch_put
  402. };
  403. /* Time */
  404. static int snd_mts64_ctl_smpte_time_h_info(struct snd_kcontrol *kctl,
  405. struct snd_ctl_elem_info *uinfo)
  406. {
  407. uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
  408. uinfo->count = 1;
  409. uinfo->value.integer.min = 0;
  410. uinfo->value.integer.max = 23;
  411. return 0;
  412. }
  413. static int snd_mts64_ctl_smpte_time_f_info(struct snd_kcontrol *kctl,
  414. struct snd_ctl_elem_info *uinfo)
  415. {
  416. uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
  417. uinfo->count = 1;
  418. uinfo->value.integer.min = 0;
  419. uinfo->value.integer.max = 99;
  420. return 0;
  421. }
  422. static int snd_mts64_ctl_smpte_time_info(struct snd_kcontrol *kctl,
  423. struct snd_ctl_elem_info *uinfo)
  424. {
  425. uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
  426. uinfo->count = 1;
  427. uinfo->value.integer.min = 0;
  428. uinfo->value.integer.max = 59;
  429. return 0;
  430. }
  431. static int snd_mts64_ctl_smpte_time_get(struct snd_kcontrol *kctl,
  432. struct snd_ctl_elem_value *uctl)
  433. {
  434. struct mts64 *mts = snd_kcontrol_chip(kctl);
  435. int idx = kctl->private_value;
  436. spin_lock_irq(&mts->lock);
  437. uctl->value.integer.value[0] = mts->time[idx];
  438. spin_unlock_irq(&mts->lock);
  439. return 0;
  440. }
  441. static int snd_mts64_ctl_smpte_time_put(struct snd_kcontrol *kctl,
  442. struct snd_ctl_elem_value *uctl)
  443. {
  444. struct mts64 *mts = snd_kcontrol_chip(kctl);
  445. int idx = kctl->private_value;
  446. unsigned int time = uctl->value.integer.value[0] % 60;
  447. int changed = 0;
  448. spin_lock_irq(&mts->lock);
  449. if (mts->time[idx] != time) {
  450. changed = 1;
  451. mts->time[idx] = time;
  452. }
  453. spin_unlock_irq(&mts->lock);
  454. return changed;
  455. }
  456. static const struct snd_kcontrol_new mts64_ctl_smpte_time_hours = {
  457. .iface = SNDRV_CTL_ELEM_IFACE_RAWMIDI,
  458. .name = "SMPTE Time Hours",
  459. .index = 0,
  460. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
  461. .private_value = 0,
  462. .info = snd_mts64_ctl_smpte_time_h_info,
  463. .get = snd_mts64_ctl_smpte_time_get,
  464. .put = snd_mts64_ctl_smpte_time_put
  465. };
  466. static const struct snd_kcontrol_new mts64_ctl_smpte_time_minutes = {
  467. .iface = SNDRV_CTL_ELEM_IFACE_RAWMIDI,
  468. .name = "SMPTE Time Minutes",
  469. .index = 0,
  470. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
  471. .private_value = 1,
  472. .info = snd_mts64_ctl_smpte_time_info,
  473. .get = snd_mts64_ctl_smpte_time_get,
  474. .put = snd_mts64_ctl_smpte_time_put
  475. };
  476. static const struct snd_kcontrol_new mts64_ctl_smpte_time_seconds = {
  477. .iface = SNDRV_CTL_ELEM_IFACE_RAWMIDI,
  478. .name = "SMPTE Time Seconds",
  479. .index = 0,
  480. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
  481. .private_value = 2,
  482. .info = snd_mts64_ctl_smpte_time_info,
  483. .get = snd_mts64_ctl_smpte_time_get,
  484. .put = snd_mts64_ctl_smpte_time_put
  485. };
  486. static const struct snd_kcontrol_new mts64_ctl_smpte_time_frames = {
  487. .iface = SNDRV_CTL_ELEM_IFACE_RAWMIDI,
  488. .name = "SMPTE Time Frames",
  489. .index = 0,
  490. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
  491. .private_value = 3,
  492. .info = snd_mts64_ctl_smpte_time_f_info,
  493. .get = snd_mts64_ctl_smpte_time_get,
  494. .put = snd_mts64_ctl_smpte_time_put
  495. };
  496. /* FPS */
  497. static int snd_mts64_ctl_smpte_fps_info(struct snd_kcontrol *kctl,
  498. struct snd_ctl_elem_info *uinfo)
  499. {
  500. static const char * const texts[5] = {
  501. "24", "25", "29.97", "30D", "30"
  502. };
  503. return snd_ctl_enum_info(uinfo, 1, 5, texts);
  504. }
  505. static int snd_mts64_ctl_smpte_fps_get(struct snd_kcontrol *kctl,
  506. struct snd_ctl_elem_value *uctl)
  507. {
  508. struct mts64 *mts = snd_kcontrol_chip(kctl);
  509. spin_lock_irq(&mts->lock);
  510. uctl->value.enumerated.item[0] = mts->fps;
  511. spin_unlock_irq(&mts->lock);
  512. return 0;
  513. }
  514. static int snd_mts64_ctl_smpte_fps_put(struct snd_kcontrol *kctl,
  515. struct snd_ctl_elem_value *uctl)
  516. {
  517. struct mts64 *mts = snd_kcontrol_chip(kctl);
  518. int changed = 0;
  519. if (uctl->value.enumerated.item[0] >= 5)
  520. return -EINVAL;
  521. spin_lock_irq(&mts->lock);
  522. if (mts->fps != uctl->value.enumerated.item[0]) {
  523. changed = 1;
  524. mts->fps = uctl->value.enumerated.item[0];
  525. }
  526. spin_unlock_irq(&mts->lock);
  527. return changed;
  528. }
  529. static const struct snd_kcontrol_new mts64_ctl_smpte_fps = {
  530. .iface = SNDRV_CTL_ELEM_IFACE_RAWMIDI,
  531. .name = "SMPTE Fps",
  532. .index = 0,
  533. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
  534. .private_value = 0,
  535. .info = snd_mts64_ctl_smpte_fps_info,
  536. .get = snd_mts64_ctl_smpte_fps_get,
  537. .put = snd_mts64_ctl_smpte_fps_put
  538. };
  539. static int snd_mts64_ctl_create(struct snd_card *card,
  540. struct mts64 *mts)
  541. {
  542. int err, i;
  543. static const struct snd_kcontrol_new *control[] = {
  544. &mts64_ctl_smpte_switch,
  545. &mts64_ctl_smpte_time_hours,
  546. &mts64_ctl_smpte_time_minutes,
  547. &mts64_ctl_smpte_time_seconds,
  548. &mts64_ctl_smpte_time_frames,
  549. &mts64_ctl_smpte_fps,
  550. NULL };
  551. for (i = 0; control[i]; ++i) {
  552. err = snd_ctl_add(card, snd_ctl_new1(control[i], mts));
  553. if (err < 0) {
  554. dev_dbg(card->dev, "Cannot create control: %s\n",
  555. control[i]->name);
  556. return err;
  557. }
  558. }
  559. return 0;
  560. }
  561. /*********************************************************************
  562. * Rawmidi
  563. *********************************************************************/
  564. #define MTS64_MODE_INPUT_TRIGGERED 0x01
  565. static int snd_mts64_rawmidi_open(struct snd_rawmidi_substream *substream)
  566. {
  567. struct mts64 *mts = substream->rmidi->private_data;
  568. if (mts->open_count == 0) {
  569. /* We don't need a spinlock here, because this is just called
  570. if the device has not been opened before.
  571. So there aren't any IRQs from the device */
  572. mts64_device_open(mts);
  573. msleep(50);
  574. }
  575. ++(mts->open_count);
  576. return 0;
  577. }
  578. static int snd_mts64_rawmidi_close(struct snd_rawmidi_substream *substream)
  579. {
  580. struct mts64 *mts = substream->rmidi->private_data;
  581. unsigned long flags;
  582. --(mts->open_count);
  583. if (mts->open_count == 0) {
  584. /* We need the spinlock_irqsave here because we can still
  585. have IRQs at this point */
  586. spin_lock_irqsave(&mts->lock, flags);
  587. mts64_device_close(mts);
  588. spin_unlock_irqrestore(&mts->lock, flags);
  589. msleep(500);
  590. } else if (mts->open_count < 0)
  591. mts->open_count = 0;
  592. return 0;
  593. }
  594. static void snd_mts64_rawmidi_output_trigger(struct snd_rawmidi_substream *substream,
  595. int up)
  596. {
  597. struct mts64 *mts = substream->rmidi->private_data;
  598. u8 data;
  599. unsigned long flags;
  600. spin_lock_irqsave(&mts->lock, flags);
  601. while (snd_rawmidi_transmit_peek(substream, &data, 1) == 1) {
  602. mts64_write_midi(mts, data, substream->number+1);
  603. snd_rawmidi_transmit_ack(substream, 1);
  604. }
  605. spin_unlock_irqrestore(&mts->lock, flags);
  606. }
  607. static void snd_mts64_rawmidi_input_trigger(struct snd_rawmidi_substream *substream,
  608. int up)
  609. {
  610. struct mts64 *mts = substream->rmidi->private_data;
  611. unsigned long flags;
  612. spin_lock_irqsave(&mts->lock, flags);
  613. if (up)
  614. mts->mode[substream->number] |= MTS64_MODE_INPUT_TRIGGERED;
  615. else
  616. mts->mode[substream->number] &= ~MTS64_MODE_INPUT_TRIGGERED;
  617. spin_unlock_irqrestore(&mts->lock, flags);
  618. }
  619. static const struct snd_rawmidi_ops snd_mts64_rawmidi_output_ops = {
  620. .open = snd_mts64_rawmidi_open,
  621. .close = snd_mts64_rawmidi_close,
  622. .trigger = snd_mts64_rawmidi_output_trigger
  623. };
  624. static const struct snd_rawmidi_ops snd_mts64_rawmidi_input_ops = {
  625. .open = snd_mts64_rawmidi_open,
  626. .close = snd_mts64_rawmidi_close,
  627. .trigger = snd_mts64_rawmidi_input_trigger
  628. };
  629. /* Create and initialize the rawmidi component */
  630. static int snd_mts64_rawmidi_create(struct snd_card *card)
  631. {
  632. struct mts64 *mts = card->private_data;
  633. struct snd_rawmidi *rmidi;
  634. struct snd_rawmidi_substream *substream;
  635. struct list_head *list;
  636. int err;
  637. err = snd_rawmidi_new(card, CARD_NAME, 0,
  638. MTS64_NUM_OUTPUT_PORTS,
  639. MTS64_NUM_INPUT_PORTS,
  640. &rmidi);
  641. if (err < 0)
  642. return err;
  643. rmidi->private_data = mts;
  644. strcpy(rmidi->name, CARD_NAME);
  645. rmidi->info_flags = SNDRV_RAWMIDI_INFO_OUTPUT |
  646. SNDRV_RAWMIDI_INFO_INPUT |
  647. SNDRV_RAWMIDI_INFO_DUPLEX;
  648. mts->rmidi = rmidi;
  649. /* register rawmidi ops */
  650. snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT,
  651. &snd_mts64_rawmidi_output_ops);
  652. snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_INPUT,
  653. &snd_mts64_rawmidi_input_ops);
  654. /* name substreams */
  655. /* output */
  656. list_for_each(list,
  657. &rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams) {
  658. substream = list_entry(list, struct snd_rawmidi_substream, list);
  659. sprintf(substream->name,
  660. "Miditerminal %d", substream->number+1);
  661. }
  662. /* input */
  663. list_for_each(list,
  664. &rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT].substreams) {
  665. substream = list_entry(list, struct snd_rawmidi_substream, list);
  666. mts->midi_input_substream[substream->number] = substream;
  667. switch(substream->number) {
  668. case MTS64_SMPTE_SUBSTREAM:
  669. strcpy(substream->name, "Miditerminal SMPTE");
  670. break;
  671. default:
  672. sprintf(substream->name,
  673. "Miditerminal %d", substream->number+1);
  674. }
  675. }
  676. /* controls */
  677. err = snd_mts64_ctl_create(card, mts);
  678. return err;
  679. }
  680. /*********************************************************************
  681. * parport stuff
  682. *********************************************************************/
  683. static void snd_mts64_interrupt(void *private)
  684. {
  685. struct mts64 *mts = ((struct snd_card*)private)->private_data;
  686. u16 ret;
  687. u8 status, data;
  688. struct snd_rawmidi_substream *substream;
  689. if (!mts)
  690. return;
  691. spin_lock(&mts->lock);
  692. ret = mts64_read(mts->pardev->port);
  693. data = ret & 0x00ff;
  694. status = ret >> 8;
  695. if (status & MTS64_STAT_PORT) {
  696. mts->current_midi_input_port = mts64_map_midi_input(data);
  697. } else {
  698. if (mts->current_midi_input_port == -1)
  699. goto __out;
  700. substream = mts->midi_input_substream[mts->current_midi_input_port];
  701. if (mts->mode[substream->number] & MTS64_MODE_INPUT_TRIGGERED)
  702. snd_rawmidi_receive(substream, &data, 1);
  703. }
  704. __out:
  705. spin_unlock(&mts->lock);
  706. }
  707. static void snd_mts64_attach(struct parport *p)
  708. {
  709. struct platform_device *device;
  710. device = platform_device_alloc(PLATFORM_DRIVER, device_count);
  711. if (!device)
  712. return;
  713. /* Temporary assignment to forward the parport */
  714. platform_set_drvdata(device, p);
  715. if (platform_device_add(device) < 0) {
  716. platform_device_put(device);
  717. return;
  718. }
  719. /* Since we dont get the return value of probe
  720. * We need to check if device probing succeeded or not */
  721. if (!platform_get_drvdata(device)) {
  722. platform_device_unregister(device);
  723. return;
  724. }
  725. /* register device in global table */
  726. platform_devices[device_count] = device;
  727. device_count++;
  728. }
  729. static void snd_mts64_detach(struct parport *p)
  730. {
  731. /* nothing to do here */
  732. }
  733. static int snd_mts64_dev_probe(struct pardevice *pardev)
  734. {
  735. if (strcmp(pardev->name, DRIVER_NAME))
  736. return -ENODEV;
  737. return 0;
  738. }
  739. static struct parport_driver mts64_parport_driver = {
  740. .name = "mts64",
  741. .probe = snd_mts64_dev_probe,
  742. .match_port = snd_mts64_attach,
  743. .detach = snd_mts64_detach,
  744. };
  745. /*********************************************************************
  746. * platform stuff
  747. *********************************************************************/
  748. static void snd_mts64_card_private_free(struct snd_card *card)
  749. {
  750. struct mts64 *mts = card->private_data;
  751. struct pardevice *pardev = mts->pardev;
  752. if (pardev) {
  753. parport_release(pardev);
  754. parport_unregister_device(pardev);
  755. }
  756. snd_mts64_free(mts);
  757. }
  758. static int snd_mts64_probe(struct platform_device *pdev)
  759. {
  760. struct pardevice *pardev;
  761. struct parport *p;
  762. int dev = pdev->id;
  763. struct snd_card *card = NULL;
  764. struct mts64 *mts = NULL;
  765. int err;
  766. struct pardev_cb mts64_cb = {
  767. .preempt = NULL,
  768. .wakeup = NULL,
  769. .irq_func = snd_mts64_interrupt, /* ISR */
  770. .flags = PARPORT_DEV_EXCL, /* flags */
  771. };
  772. p = platform_get_drvdata(pdev);
  773. platform_set_drvdata(pdev, NULL);
  774. if (dev >= SNDRV_CARDS)
  775. return -ENODEV;
  776. if (!enable[dev])
  777. return -ENOENT;
  778. err = snd_card_new(&pdev->dev, index[dev], id[dev], THIS_MODULE,
  779. 0, &card);
  780. if (err < 0) {
  781. dev_dbg(&pdev->dev, "Cannot create card\n");
  782. return err;
  783. }
  784. strcpy(card->driver, DRIVER_NAME);
  785. strcpy(card->shortname, "ESI " CARD_NAME);
  786. sprintf(card->longname, "%s at 0x%lx, irq %i",
  787. card->shortname, p->base, p->irq);
  788. mts64_cb.private = card; /* private */
  789. pardev = parport_register_dev_model(p, /* port */
  790. DRIVER_NAME, /* name */
  791. &mts64_cb, /* callbacks */
  792. pdev->id); /* device number */
  793. if (!pardev) {
  794. dev_dbg(card->dev, "Cannot register pardevice\n");
  795. err = -EIO;
  796. goto __err;
  797. }
  798. /* claim parport */
  799. if (parport_claim(pardev)) {
  800. dev_dbg(card->dev, "Cannot claim parport 0x%lx\n", pardev->port->base);
  801. err = -EIO;
  802. goto free_pardev;
  803. }
  804. err = snd_mts64_create(card, pardev, &mts);
  805. if (err < 0) {
  806. dev_dbg(card->dev, "Cannot create main component\n");
  807. goto release_pardev;
  808. }
  809. card->private_data = mts;
  810. card->private_free = snd_mts64_card_private_free;
  811. err = mts64_probe(p);
  812. if (err) {
  813. err = -EIO;
  814. goto __err;
  815. }
  816. err = snd_mts64_rawmidi_create(card);
  817. if (err < 0) {
  818. dev_dbg(card->dev, "Creating Rawmidi component failed\n");
  819. goto __err;
  820. }
  821. /* init device */
  822. err = mts64_device_init(p);
  823. if (err < 0)
  824. goto __err;
  825. platform_set_drvdata(pdev, card);
  826. /* At this point card will be usable */
  827. err = snd_card_register(card);
  828. if (err < 0) {
  829. dev_dbg(card->dev, "Cannot register card\n");
  830. goto __err;
  831. }
  832. dev_info(card->dev, "ESI Miditerminal 4140 on 0x%lx\n", p->base);
  833. return 0;
  834. release_pardev:
  835. parport_release(pardev);
  836. free_pardev:
  837. parport_unregister_device(pardev);
  838. __err:
  839. snd_card_free(card);
  840. return err;
  841. }
  842. static void snd_mts64_remove(struct platform_device *pdev)
  843. {
  844. struct snd_card *card = platform_get_drvdata(pdev);
  845. if (card)
  846. snd_card_free(card);
  847. }
  848. static struct platform_driver snd_mts64_driver = {
  849. .probe = snd_mts64_probe,
  850. .remove_new = snd_mts64_remove,
  851. .driver = {
  852. .name = PLATFORM_DRIVER,
  853. }
  854. };
  855. /*********************************************************************
  856. * module init stuff
  857. *********************************************************************/
  858. static void snd_mts64_unregister_all(void)
  859. {
  860. int i;
  861. for (i = 0; i < SNDRV_CARDS; ++i) {
  862. if (platform_devices[i]) {
  863. platform_device_unregister(platform_devices[i]);
  864. platform_devices[i] = NULL;
  865. }
  866. }
  867. platform_driver_unregister(&snd_mts64_driver);
  868. parport_unregister_driver(&mts64_parport_driver);
  869. }
  870. static int __init snd_mts64_module_init(void)
  871. {
  872. int err;
  873. err = platform_driver_register(&snd_mts64_driver);
  874. if (err < 0)
  875. return err;
  876. if (parport_register_driver(&mts64_parport_driver) != 0) {
  877. platform_driver_unregister(&snd_mts64_driver);
  878. return -EIO;
  879. }
  880. if (device_count == 0) {
  881. snd_mts64_unregister_all();
  882. return -ENODEV;
  883. }
  884. return 0;
  885. }
  886. static void __exit snd_mts64_module_exit(void)
  887. {
  888. snd_mts64_unregister_all();
  889. }
  890. module_init(snd_mts64_module_init);
  891. module_exit(snd_mts64_module_exit);