dmy.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:24k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: dmy.c,v 1.10 2001/10/08 22:19:50 davem Exp $
  2.  * drivers/sbus/audio/dummy.c
  3.  *
  4.  * Copyright 1998 Derrick J Brashear (shadow@andrew.cmu.edu)
  5.  *
  6.  * This is a dummy lowlevel driver. Consider it a distant cousin of 
  7.  * /proc/audio; It pretends to be a piece of audio hardware, and writes
  8.  * to a file instead. (or will shortly)
  9.  */
  10. #include <linux/module.h>
  11. #include <linux/kernel.h>
  12. #include <linux/sched.h>
  13. #include <linux/errno.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/slab.h>
  16. #include <linux/init.h>
  17. #include <linux/soundcard.h>
  18. #include <linux/delay.h>
  19. #include <asm/openprom.h>
  20. #include <asm/oplib.h>
  21. #include <asm/system.h>
  22. #include <asm/io.h>
  23. #include <asm/pgtable.h>
  24. #include <asm/sbus.h>
  25. #include <asm/audioio.h>
  26. #include "dummy.h"
  27. #define MAX_DRIVERS 1
  28. static struct sparcaudio_driver drivers[MAX_DRIVERS];
  29. static int num_drivers;
  30. static int dummy_play_gain(struct sparcaudio_driver *drv, int value, 
  31.                             unsigned char balance);
  32. static int dummy_record_gain(struct sparcaudio_driver *drv, int value, 
  33.                             unsigned char balance);
  34. static int dummy_output_muted(struct sparcaudio_driver *drv, int value);
  35. static int dummy_attach(struct sparcaudio_driver *drv) __init;
  36. static int
  37. dummy_set_output_encoding(struct sparcaudio_driver *drv, int value)
  38. {
  39.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  40.         if (value != 0) {
  41.                 dummy_chip->perchip_info.play.encoding = value;
  42.                 return 0;
  43.         }
  44.         return -EINVAL;
  45. }
  46. static int
  47. dummy_set_input_encoding(struct sparcaudio_driver *drv, int value)
  48. {
  49.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  50.         if (value != 0) {
  51.                 dummy_chip->perchip_info.record.encoding = value;
  52.                 return 0;
  53.         }
  54.         return -EINVAL;
  55. }
  56. static int dummy_get_output_encoding(struct sparcaudio_driver *drv)
  57. {
  58.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  59.         return dummy_chip->perchip_info.play.encoding;
  60. }
  61. static int dummy_get_input_encoding(struct sparcaudio_driver *drv)
  62. {
  63.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  64.         return dummy_chip->perchip_info.record.encoding;
  65. }
  66. static int
  67. dummy_set_output_rate(struct sparcaudio_driver *drv, int value)
  68. {
  69.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  70.         if (value != 0) {
  71.                 dummy_chip->perchip_info.play.sample_rate = value;
  72.                 return 0;
  73.         }
  74.         return -EINVAL;
  75. }
  76. static int
  77. dummy_set_input_rate(struct sparcaudio_driver *drv, int value)
  78. {
  79.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  80.         if (value != 0) {
  81.                 dummy_chip->perchip_info.record.sample_rate = value;
  82.                 return 0;
  83.         }
  84.         return -EINVAL;
  85. }
  86. static int dummy_get_output_rate(struct sparcaudio_driver *drv)
  87. {
  88.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  89.         return dummy_chip->perchip_info.play.sample_rate;
  90. }
  91. static int dummy_get_input_rate(struct sparcaudio_driver *drv)
  92. {
  93.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  94.         return dummy_chip->perchip_info.record.sample_rate;
  95. }
  96. /* Generically we support 4 channels. This does 2 */
  97. static int
  98. dummy_set_output_channels(struct sparcaudio_driver *drv, int value)
  99. {
  100.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  101.         switch (value) {
  102.         case 1:
  103.         case 2:
  104.                 break;
  105.         default:
  106.                 return -(EINVAL);
  107.         };
  108.         dummy_chip->perchip_info.play.channels = value;
  109.         return 0;
  110. }
  111. /* Generically we support 4 channels. This does 2 */
  112. static int
  113. dummy_set_input_channels(struct sparcaudio_driver *drv, int value)
  114. {
  115.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  116.         switch (value) {
  117.         case 1:
  118.         case 2:
  119.                 break;
  120.         default:
  121.                 return -(EINVAL);
  122.         };
  123.         dummy_chip->perchip_info.record.channels = value;
  124.         return 0;
  125. }
  126. static int dummy_get_input_channels(struct sparcaudio_driver *drv)
  127. {
  128.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  129.         return dummy_chip->perchip_info.record.channels;
  130. }
  131. static int dummy_get_output_channels(struct sparcaudio_driver *drv)
  132. {
  133.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  134.         return dummy_chip->perchip_info.play.channels;
  135. }
  136. static int dummy_get_output_precision(struct sparcaudio_driver *drv)
  137. {
  138.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  139.         return dummy_chip->perchip_info.play.precision;
  140. }
  141. static int dummy_get_input_precision(struct sparcaudio_driver *drv)
  142. {
  143.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  144.         return dummy_chip->perchip_info.record.precision;
  145. }
  146. static int dummy_set_output_precision(struct sparcaudio_driver *drv, int val)
  147. {
  148.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private; 
  149.         dummy_chip->perchip_info.play.precision = val;
  150.         return dummy_chip->perchip_info.play.precision;
  151. }
  152. static int dummy_set_input_precision(struct sparcaudio_driver *drv, int val)
  153. {
  154.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private; 
  155.         dummy_chip->perchip_info.record.precision = val;
  156.         return dummy_chip->perchip_info.record.precision;
  157. }
  158. /* Set output mute */
  159. static int dummy_output_muted(struct sparcaudio_driver *drv, int value)
  160. {
  161.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  162.         if (!value) 
  163.                 dummy_chip->perchip_info.output_muted = 0;
  164.         else
  165.                 dummy_chip->perchip_info.output_muted = 1;
  166.         return 0;
  167. }
  168. static int dummy_get_output_muted(struct sparcaudio_driver *drv)
  169. {
  170.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  171.         return dummy_chip->perchip_info.output_muted;
  172. }
  173. static int dummy_get_formats(struct sparcaudio_driver *drv)
  174. {
  175.         return (AFMT_MU_LAW | AFMT_A_LAW |
  176.                 AFMT_U8 | AFMT_IMA_ADPCM | 
  177.                 AFMT_S16_LE | AFMT_S16_BE);
  178. }
  179. static int dummy_get_output_ports(struct sparcaudio_driver *drv)
  180. {
  181.         return (AUDIO_LINE_OUT | AUDIO_SPEAKER | AUDIO_HEADPHONE);
  182. }
  183. static int dummy_get_input_ports(struct sparcaudio_driver *drv)
  184. {
  185.         return (AUDIO_ANALOG_LOOPBACK);
  186. }
  187. /* Set chip "output" port */
  188. static int dummy_set_output_port(struct sparcaudio_driver *drv, int value)
  189. {
  190.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  191.         dummy_chip->perchip_info.play.port = value;
  192.         return value;
  193. }
  194. static int dummy_set_input_port(struct sparcaudio_driver *drv, int value)
  195. {
  196.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  197.         dummy_chip->perchip_info.record.port = value;
  198.         return value;
  199. }
  200. static int dummy_get_output_port(struct sparcaudio_driver *drv)
  201. {
  202.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  203.         return dummy_chip->perchip_info.play.port;
  204. }
  205. static int dummy_get_input_port(struct sparcaudio_driver *drv)
  206. {
  207.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  208.         return dummy_chip->perchip_info.record.port;
  209. }
  210. static int dummy_get_output_error(struct sparcaudio_driver *drv)
  211. {
  212.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  213.         return (int) dummy_chip->perchip_info.play.error;
  214. }
  215. static int dummy_get_input_error(struct sparcaudio_driver *drv)
  216. {
  217.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  218.         return (int) dummy_chip->perchip_info.record.error;
  219. }
  220. static int dummy_get_output_samples(struct sparcaudio_driver *drv)
  221. {
  222.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  223.         return dummy_chip->perchip_info.play.samples;
  224. }
  225. static int dummy_get_output_pause(struct sparcaudio_driver *drv)
  226. {
  227.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  228.         return (int) dummy_chip->perchip_info.play.pause;
  229. }
  230. static int dummy_set_output_volume(struct sparcaudio_driver *drv, int value)
  231. {
  232.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  233.         dummy_play_gain(drv, value, dummy_chip->perchip_info.play.balance);
  234.         return 0;
  235. }
  236. static int dummy_get_output_volume(struct sparcaudio_driver *drv)
  237. {
  238.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  239.         return dummy_chip->perchip_info.play.gain;
  240. }
  241. static int dummy_set_output_balance(struct sparcaudio_driver *drv, int value)
  242. {
  243.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  244.         dummy_chip->perchip_info.play.balance = value;
  245.         dummy_play_gain(drv, dummy_chip->perchip_info.play.gain, 
  246.                         dummy_chip->perchip_info.play.balance);
  247.         return 0;
  248. }
  249. static int dummy_get_output_balance(struct sparcaudio_driver *drv)
  250. {
  251.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  252.         return (int) dummy_chip->perchip_info.play.balance;
  253. }
  254. /* Set chip play gain */
  255. static int dummy_play_gain(struct sparcaudio_driver *drv,
  256.                            int value, unsigned char balance)
  257. {
  258.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  259.         int tmp = 0, r, l, r_adj, l_adj;
  260.         r = l = value;
  261.         if (balance < AUDIO_MID_BALANCE) {
  262.                 r = (int) (value -
  263.                            ((AUDIO_MID_BALANCE - balance) << AUDIO_BALANCE_SHIFT));
  264.                 if (r < 0)
  265.                         r = 0;
  266.         } else if (balance > AUDIO_MID_BALANCE) {
  267.                 l = (int) (value -
  268.                            ((balance - AUDIO_MID_BALANCE) << AUDIO_BALANCE_SHIFT));
  269.                 if (l < 0)
  270.                         l = 0;
  271.         }
  272.         (l == 0) ? (l_adj = DUMMY_MAX_DEV_ATEN) : (l_adj = DUMMY_MAX_ATEN - 
  273.                                                    (l * (DUMMY_MAX_ATEN + 1) / 
  274.                                                     (AUDIO_MAX_GAIN + 1)));
  275.         (r == 0) ? (r_adj = DUMMY_MAX_DEV_ATEN) : (r_adj = DUMMY_MAX_ATEN -
  276.                                                    (r * (DUMMY_MAX_ATEN + 1) /
  277.                                                     (AUDIO_MAX_GAIN + 1)));
  278.         if ((value == 0) || (value == AUDIO_MAX_GAIN)) {
  279.                 tmp = value;
  280.         } else {
  281.                 if (value == l) {
  282.                         tmp = ((DUMMY_MAX_ATEN - l_adj) * (AUDIO_MAX_GAIN + 1) / 
  283.                                (DUMMY_MAX_ATEN + 1));
  284.                 } else if (value == r) {
  285.                         tmp = ((DUMMY_MAX_ATEN - r_adj) * (AUDIO_MAX_GAIN + 1) / 
  286.                                (DUMMY_MAX_ATEN + 1));
  287.                 }
  288.         }
  289.         dummy_chip->perchip_info.play.gain = tmp;
  290.         return 0;
  291. }
  292. static int dummy_get_input_samples(struct sparcaudio_driver *drv)
  293. {
  294.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  295.         return dummy_chip->perchip_info.record.samples;
  296. }
  297. static int dummy_get_input_pause(struct sparcaudio_driver *drv)
  298. {
  299.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  300.         return (int) dummy_chip->perchip_info.record.pause;
  301. }
  302. static int dummy_set_monitor_volume(struct sparcaudio_driver *drv, int value)
  303. {
  304.         return 0;
  305. }
  306. static int dummy_get_monitor_volume(struct sparcaudio_driver *drv)
  307. {
  308.         return 0;
  309. }
  310. static int dummy_set_input_volume(struct sparcaudio_driver *drv, int value)
  311. {
  312.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  313.         dummy_record_gain(drv, value, dummy_chip->perchip_info.record.balance);
  314.         return 0;
  315. }
  316. static int dummy_get_input_volume(struct sparcaudio_driver *drv)
  317. {
  318.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  319.         return dummy_chip->perchip_info.record.gain;
  320. }
  321. static int dummy_set_input_balance(struct sparcaudio_driver *drv, int value)
  322. {
  323.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  324.         dummy_chip->perchip_info.record.balance = value;
  325.         dummy_record_gain(drv, dummy_chip->perchip_info.record.gain, 
  326.                           dummy_chip->perchip_info.play.balance);
  327.         return 0;
  328. }
  329. static int dummy_get_input_balance(struct sparcaudio_driver *drv)
  330. {
  331.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  332.         return (int) dummy_chip->perchip_info.record.balance;
  333. }
  334. static int dummy_record_gain(struct sparcaudio_driver *drv,
  335.                              int value, unsigned char balance)
  336. {
  337.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  338.         int tmp = 0, r, l, r_adj, l_adj;
  339.         r = l = value;
  340.         if (balance < AUDIO_MID_BALANCE) {
  341.                 r = (int) (value -
  342.                            ((AUDIO_MID_BALANCE - balance) << AUDIO_BALANCE_SHIFT));
  343.                 if (r < 0)
  344.                         r = 0;
  345.         } else if (balance > AUDIO_MID_BALANCE) {
  346.                 l = (int) (value -
  347.                            ((balance - AUDIO_MID_BALANCE) << AUDIO_BALANCE_SHIFT));
  348.                 if (l < 0)
  349.                         l = 0;
  350.         }
  351.         (l == 0) ? (l_adj = DUMMY_MAX_DEV_ATEN) : (l_adj = DUMMY_MAX_ATEN - 
  352.                                                    (l * (DUMMY_MAX_ATEN + 1) / 
  353.                                                     (AUDIO_MAX_GAIN + 1)));
  354.         (r == 0) ? (r_adj = DUMMY_MAX_DEV_ATEN) : (r_adj = DUMMY_MAX_ATEN -
  355.                                                    (r * (DUMMY_MAX_ATEN + 1) /
  356.                                                     (AUDIO_MAX_GAIN + 1)));
  357.         if ((value == 0) || (value == AUDIO_MAX_GAIN)) {
  358.                 tmp = value;
  359.         } else {
  360.                 if (value == l) {
  361.                         tmp = ((DUMMY_MAX_ATEN - l_adj) * (AUDIO_MAX_GAIN + 1) / 
  362.                                (DUMMY_MAX_ATEN + 1));
  363.                 } else if (value == r) {
  364.                         tmp = ((DUMMY_MAX_ATEN - r_adj) * (AUDIO_MAX_GAIN + 1) / 
  365.                                (DUMMY_MAX_ATEN + 1));
  366.                 }
  367.         }
  368.         dummy_chip->perchip_info.record.gain = tmp;
  369.         return 0;
  370. }
  371. /* Reset the audio chip to a sane state. */
  372. static void dummy_chip_reset(struct sparcaudio_driver *drv)
  373. {
  374.         dummy_set_output_encoding(drv, AUDIO_ENCODING_ULAW);
  375.         dummy_set_output_rate(drv, DUMMY_RATE);
  376.         dummy_set_output_channels(drv, DUMMY_CHANNELS);
  377.         dummy_set_output_precision(drv, DUMMY_PRECISION);
  378.         dummy_set_output_balance(drv, AUDIO_MID_BALANCE);
  379.         dummy_set_output_volume(drv, DUMMY_DEFAULT_PLAYGAIN);
  380.         dummy_set_output_port(drv, AUDIO_SPEAKER);
  381.         dummy_output_muted(drv, 0);
  382.         dummy_set_input_encoding(drv, AUDIO_ENCODING_ULAW);
  383.         dummy_set_input_rate(drv, DUMMY_RATE);
  384.         dummy_set_input_channels(drv, DUMMY_CHANNELS);
  385.         dummy_set_input_precision(drv, DUMMY_PRECISION);
  386.         dummy_set_input_balance(drv, AUDIO_MID_BALANCE);
  387.         dummy_set_input_volume(drv, DUMMY_DEFAULT_PLAYGAIN);
  388.         dummy_set_input_port(drv, AUDIO_SPEAKER);
  389. }
  390. static int dummy_open(struct inode * inode, struct file * file, struct sparcaudio_driver *drv)
  391. {
  392.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  393.         /* Set the default audio parameters if not already in use. */
  394.         if (file->f_mode & FMODE_WRITE) {
  395.                 if (!(drv->flags & SDF_OPEN_WRITE) && 
  396.                     (dummy_chip->perchip_info.play.active == 0)) {
  397.                         dummy_chip->perchip_info.play.open = 1;
  398.                         dummy_chip->perchip_info.play.samples =
  399.                                 dummy_chip->perchip_info.play.error = 0;
  400.                 }
  401.         }
  402.         if (file->f_mode & FMODE_READ) {
  403.                 if (!(drv->flags & SDF_OPEN_READ) && 
  404.                     (dummy_chip->perchip_info.record.active == 0)) {
  405.                         dummy_chip->perchip_info.record.open = 1;
  406.                         dummy_chip->perchip_info.record.samples =
  407.                                 dummy_chip->perchip_info.record.error = 0;
  408.                 }
  409.         }
  410.         MOD_INC_USE_COUNT;
  411.         return 0;
  412. }
  413. static void dummy_release(struct inode * inode, struct file * file, struct sparcaudio_driver *drv)
  414. {
  415.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  416.         if (file->f_mode & FMODE_WRITE) {
  417.                 dummy_chip->perchip_info.play.active =
  418.                         dummy_chip->perchip_info.play.open = 0;
  419.         }
  420.         if (file->f_mode & FMODE_READ) {
  421.                 dummy_chip->perchip_info.record.active =
  422.                         dummy_chip->perchip_info.record.open = 0;
  423.         }
  424.         MOD_DEC_USE_COUNT;
  425. }
  426. static void dummy_output_done_task(void * arg)
  427. {
  428.         struct sparcaudio_driver *drv = (struct sparcaudio_driver *) arg;
  429.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  430.         sparcaudio_output_done(drv, 1);
  431.         if (dummy_chip->perchip_info.record.active)
  432.                 sparcaudio_input_done(drv, 1);
  433. }
  434. static void dummy_start_output(struct sparcaudio_driver *drv, __u8 * buffer,
  435.                                unsigned long count)
  436. {
  437.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  438.         if (dummy_chip->perchip_info.play.pause || !count) 
  439.                 return;
  440.         dummy_chip->perchip_info.play.active = 1;
  441.         /* fake an "interrupt" to deal with this block */
  442.         INIT_LIST_HEAD(&dummy_chip->tqueue.list);
  443.         dummy_chip->tqueue.sync = 0;
  444.         dummy_chip->tqueue.routine = dummy_output_done_task;
  445.         dummy_chip->tqueue.data = drv;
  446.         queue_task(&dummy_chip->tqueue, &tq_immediate);
  447.         mark_bh(IMMEDIATE_BH);
  448. }
  449. static void dummy_start_input(struct sparcaudio_driver *drv, __u8 * buffer,
  450.                               unsigned long count)
  451. {
  452.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  453.         dummy_chip->perchip_info.record.active = 1;
  454. }
  455. static void dummy_stop_output(struct sparcaudio_driver *drv)
  456. {
  457.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  458.         dummy_chip->perchip_info.play.active = 0;
  459. }
  460. static void dummy_stop_input(struct sparcaudio_driver *drv)
  461. {
  462.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  463.         dummy_chip->perchip_info.record.active = 0;
  464. }
  465. static int dummy_set_output_pause(struct sparcaudio_driver *drv, int value)
  466. {
  467.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  468.         dummy_chip->perchip_info.play.pause = value;
  469.         if (!value)
  470.                 sparcaudio_output_done(drv, 0);
  471.         return value;
  472. }
  473. static int dummy_set_input_pause(struct sparcaudio_driver *drv, int value)
  474. {
  475.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  476.         dummy_chip->perchip_info.record.pause = value;
  477.         /* This should probably cause play pause. */
  478.         return value;
  479. }
  480. static int dummy_set_input_error(struct sparcaudio_driver *drv, int value)
  481. {
  482.         return 0;
  483. }
  484. static int dummy_set_output_error(struct sparcaudio_driver *drv, int value)
  485. {
  486.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  487.         int i;
  488.         i = dummy_chip->perchip_info.play.error;
  489.         dummy_chip->perchip_info.play.error = value;
  490.         return i;
  491. }
  492. static int dummy_set_output_samples(struct sparcaudio_driver *drv, int value)
  493. {
  494.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  495.         int i;
  496.         i = dummy_chip->perchip_info.play.samples;
  497.         dummy_chip->perchip_info.play.samples = value;
  498.         return i;
  499. }
  500. static int dummy_set_input_samples(struct sparcaudio_driver *drv, int value)
  501. {
  502.         struct dummy_chip *dummy_chip = (struct dummy_chip *) drv->private;
  503.         int i;
  504.         i = dummy_chip->perchip_info.play.samples;
  505.         dummy_chip->perchip_info.record.samples = value;
  506.         return i;
  507. }
  508. /* In order to fake things which care out, play we're a 4231 */
  509. static void dummy_audio_getdev(struct sparcaudio_driver *drv,
  510.                                audio_device_t * audinfo)
  511. {
  512.         strncpy(audinfo->name, "SUNW,cs4231", sizeof(audinfo->name) - 1);
  513.         strncpy(audinfo->version, "a", sizeof(audinfo->version) - 1);
  514.         strncpy(audinfo->config, "onboard1", sizeof(audinfo->config) - 1);
  515. }
  516. static int dummy_audio_getdev_sunos(struct sparcaudio_driver *drv)
  517. {
  518.         return 5; 
  519. }
  520. static struct sparcaudio_operations dummy_ops = {
  521. dummy_open,
  522. dummy_release,
  523. NULL,
  524. dummy_start_output,
  525. dummy_stop_output,
  526. dummy_start_input,
  527. dummy_stop_input,
  528. dummy_audio_getdev,
  529.         dummy_set_output_volume,
  530.         dummy_get_output_volume,
  531.         dummy_set_input_volume,
  532.         dummy_get_input_volume,
  533.         dummy_set_monitor_volume,
  534.         dummy_get_monitor_volume,
  535. dummy_set_output_balance,
  536. dummy_get_output_balance,
  537. dummy_set_input_balance,
  538. dummy_get_input_balance,
  539.         dummy_set_output_channels,
  540.         dummy_get_output_channels,
  541.         dummy_set_input_channels,
  542.         dummy_get_input_channels,
  543.         dummy_set_output_precision,
  544.         dummy_get_output_precision,
  545.         dummy_set_input_precision,
  546.         dummy_get_input_precision,
  547.         dummy_set_output_port,
  548.         dummy_get_output_port,
  549.         dummy_set_input_port,
  550.         dummy_get_input_port,
  551.         dummy_set_output_encoding,
  552.         dummy_get_output_encoding,
  553.         dummy_set_input_encoding,
  554.         dummy_get_input_encoding,
  555.         dummy_set_output_rate,
  556.         dummy_get_output_rate,
  557.         dummy_set_input_rate,
  558.         dummy_get_input_rate,
  559. dummy_audio_getdev_sunos,
  560. dummy_get_output_ports,
  561. dummy_get_input_ports,
  562. dummy_output_muted,
  563. dummy_get_output_muted,
  564. dummy_set_output_pause,
  565. dummy_get_output_pause,
  566.         dummy_set_input_pause,
  567. dummy_get_input_pause,
  568. dummy_set_output_samples,
  569. dummy_get_output_samples,
  570.         dummy_set_input_samples,
  571. dummy_get_input_samples,
  572. dummy_set_output_error,
  573. dummy_get_output_error,
  574.         dummy_set_input_error,
  575. dummy_get_input_error,
  576.         dummy_get_formats,
  577. };
  578. /* Attach to an dummy chip given its PROM node. */
  579. static int __init dummy_attach(struct sparcaudio_driver *drv)
  580. {
  581.         struct dummy_chip *dummy_chip;
  582.         int err;
  583.         /* Allocate our private information structure. */
  584.         drv->private = kmalloc(sizeof(struct dummy_chip), GFP_KERNEL);
  585.         if (drv->private == NULL)
  586.                 return -ENOMEM;
  587.         /* Point at the information structure and initialize it. */
  588.         drv->ops = &dummy_ops;
  589.         dummy_chip = (struct dummy_chip *) drv->private;
  590.         /* Reset parameters. */
  591.         dummy_chip_reset(drv);
  592.         /* Register ourselves with the midlevel audio driver. */
  593.         err = register_sparcaudio_driver(drv, 2);
  594.         if (err < 0) {
  595.                 printk(KERN_ERR "dummy: unable to registern");
  596.                 kfree(drv->private);
  597.                 return -EIO;
  598.         }
  599.         dummy_chip->perchip_info.play.active = 
  600.                 dummy_chip->perchip_info.play.pause = 0;
  601.         dummy_chip->perchip_info.play.avail_ports = (AUDIO_HEADPHONE |
  602.                                                      AUDIO_SPEAKER |
  603.                                                      AUDIO_LINE_OUT);
  604.         /* Announce the hardware to the user. */
  605.         printk(KERN_INFO "audio%d: dummy at 0x0 irq 0n", drv->index);
  606.   
  607.         /* Success! */
  608.         return 0;
  609. }
  610. /* Detach from an dummy chip given the device structure. */
  611. static void __exit dummy_detach(struct sparcaudio_driver *drv)
  612. {
  613.         unregister_sparcaudio_driver(drv, 2);
  614.         kfree(drv->private);
  615. }
  616. /* Probe for the dummy chip and then attach the driver. */
  617. static int __init dummy_init(void)
  618. {
  619. num_drivers = 0;
  620.       
  621. /* Add support here for specifying multiple dummies to attach at once. */
  622. if (dummy_attach(&drivers[num_drivers]) == 0)
  623. num_drivers++;
  624.   
  625. /* Only return success if we found some dummy chips. */
  626. return (num_drivers > 0) ? 0 : -EIO;
  627. }
  628. static void __exit dummy_exit(void)
  629. {
  630.         int i;
  631.         for (i = 0; i < num_drivers; i++) {
  632.                 dummy_detach(&drivers[i]);
  633.                 num_drivers--;
  634.         }
  635. }
  636. module_init(dummy_init);
  637. module_exit(dummy_exit);
  638. MODULE_LICENSE("GPL");
  639. /*
  640.  * Overrides for Emacs so that we follow Linus's tabbing style.
  641.  * Emacs will notice this stuff at the end of the file and automatically
  642.  * adjust the settings for this buffer only.  This must remain at the end
  643.  * of the file.
  644.  * ---------------------------------------------------------------------------
  645.  * Local variables:
  646.  * c-indent-level: 4
  647.  * c-brace-imaginary-offset: 0
  648.  * c-brace-offset: -4
  649.  * c-argdecl-indent: 4
  650.  * c-label-offset: -4
  651.  * c-continued-statement-offset: 4
  652.  * c-continued-brace-offset: 0
  653.  * indent-tabs-mode: nil
  654.  * tab-width: 8
  655.  * End:
  656.  */