1e2786ca6STakashi Sakamoto /* 2e2786ca6STakashi Sakamoto * oxfw.h - a part of driver for OXFW970/971 based devices 3e2786ca6STakashi Sakamoto * 4e2786ca6STakashi Sakamoto * Copyright (c) Clemens Ladisch <clemens@ladisch.de> 5e2786ca6STakashi Sakamoto * Licensed under the terms of the GNU General Public License, version 2. 6e2786ca6STakashi Sakamoto */ 7e2786ca6STakashi Sakamoto 8e2786ca6STakashi Sakamoto #include <linux/device.h> 9e2786ca6STakashi Sakamoto #include <linux/firewire.h> 10e2786ca6STakashi Sakamoto #include <linux/firewire-constants.h> 11e2786ca6STakashi Sakamoto #include <linux/module.h> 12e2786ca6STakashi Sakamoto #include <linux/mod_devicetable.h> 13e2786ca6STakashi Sakamoto #include <linux/mutex.h> 14e2786ca6STakashi Sakamoto #include <linux/slab.h> 15e2786ca6STakashi Sakamoto 16e2786ca6STakashi Sakamoto #include <sound/control.h> 17e2786ca6STakashi Sakamoto #include <sound/core.h> 18e2786ca6STakashi Sakamoto #include <sound/initval.h> 19e2786ca6STakashi Sakamoto #include <sound/pcm.h> 20e2786ca6STakashi Sakamoto #include <sound/pcm_params.h> 21e2786ca6STakashi Sakamoto 22e2786ca6STakashi Sakamoto #include "../lib.h" 23e2786ca6STakashi Sakamoto #include "../fcp.h" 24e2786ca6STakashi Sakamoto #include "../packets-buffer.h" 25e2786ca6STakashi Sakamoto #include "../iso-resources.h" 26e2786ca6STakashi Sakamoto #include "../amdtp.h" 27e2786ca6STakashi Sakamoto #include "../cmp.h" 28e2786ca6STakashi Sakamoto 29e2786ca6STakashi Sakamoto struct device_info { 30e2786ca6STakashi Sakamoto const char *driver_name; 31fec7b753STakashi Sakamoto const char *vendor_name; 32fec7b753STakashi Sakamoto const char *model_name; 33e2786ca6STakashi Sakamoto unsigned int mixer_channels; 34e2786ca6STakashi Sakamoto u8 mute_fb_id; 35e2786ca6STakashi Sakamoto u8 volume_fb_id; 36e2786ca6STakashi Sakamoto }; 37e2786ca6STakashi Sakamoto 385cd1d3f4STakashi Sakamoto /* This is an arbitrary number for convinience. */ 395cd1d3f4STakashi Sakamoto #define SND_OXFW_STREAM_FORMAT_ENTRIES 10 40e2786ca6STakashi Sakamoto struct snd_oxfw { 41e2786ca6STakashi Sakamoto struct snd_card *card; 42e2786ca6STakashi Sakamoto struct fw_unit *unit; 43e2786ca6STakashi Sakamoto const struct device_info *device_info; 44e2786ca6STakashi Sakamoto struct mutex mutex; 455cd1d3f4STakashi Sakamoto 465cd1d3f4STakashi Sakamoto u8 *rx_stream_formats[SND_OXFW_STREAM_FORMAT_ENTRIES]; 475cd1d3f4STakashi Sakamoto bool assumed; 48e2786ca6STakashi Sakamoto struct cmp_connection in_conn; 49e2786ca6STakashi Sakamoto struct amdtp_stream rx_stream; 505cd1d3f4STakashi Sakamoto 51e2786ca6STakashi Sakamoto bool mute; 52e2786ca6STakashi Sakamoto s16 volume[6]; 53e2786ca6STakashi Sakamoto s16 volume_min; 54e2786ca6STakashi Sakamoto s16 volume_max; 55e2786ca6STakashi Sakamoto }; 56e2786ca6STakashi Sakamoto 575b59d809STakashi Sakamoto /* 585b59d809STakashi Sakamoto * AV/C Stream Format Information Specification 1.1 Working Draft 595b59d809STakashi Sakamoto * (Apr 2005, 1394TA) 605b59d809STakashi Sakamoto */ 615b59d809STakashi Sakamoto int avc_stream_set_format(struct fw_unit *unit, enum avc_general_plug_dir dir, 625b59d809STakashi Sakamoto unsigned int pid, u8 *format, unsigned int len); 635b59d809STakashi Sakamoto int avc_stream_get_format(struct fw_unit *unit, 645b59d809STakashi Sakamoto enum avc_general_plug_dir dir, unsigned int pid, 655b59d809STakashi Sakamoto u8 *buf, unsigned int *len, unsigned int eid); 665b59d809STakashi Sakamoto static inline int 675b59d809STakashi Sakamoto avc_stream_get_format_single(struct fw_unit *unit, 685b59d809STakashi Sakamoto enum avc_general_plug_dir dir, unsigned int pid, 695b59d809STakashi Sakamoto u8 *buf, unsigned int *len) 705b59d809STakashi Sakamoto { 715b59d809STakashi Sakamoto return avc_stream_get_format(unit, dir, pid, buf, len, 0xff); 725b59d809STakashi Sakamoto } 735b59d809STakashi Sakamoto static inline int 745b59d809STakashi Sakamoto avc_stream_get_format_list(struct fw_unit *unit, 755b59d809STakashi Sakamoto enum avc_general_plug_dir dir, unsigned int pid, 765b59d809STakashi Sakamoto u8 *buf, unsigned int *len, 775b59d809STakashi Sakamoto unsigned int eid) 785b59d809STakashi Sakamoto { 795b59d809STakashi Sakamoto return avc_stream_get_format(unit, dir, pid, buf, len, eid); 805b59d809STakashi Sakamoto } 815b59d809STakashi Sakamoto 825b59d809STakashi Sakamoto /* 835b59d809STakashi Sakamoto * AV/C Digital Interface Command Set General Specification 4.2 845b59d809STakashi Sakamoto * (Sep 2004, 1394TA) 855b59d809STakashi Sakamoto */ 865b59d809STakashi Sakamoto int avc_general_inquiry_sig_fmt(struct fw_unit *unit, unsigned int rate, 875b59d809STakashi Sakamoto enum avc_general_plug_dir dir, 885b59d809STakashi Sakamoto unsigned short pid); 895b59d809STakashi Sakamoto 90e2786ca6STakashi Sakamoto int snd_oxfw_stream_init_simplex(struct snd_oxfw *oxfw); 91e2786ca6STakashi Sakamoto int snd_oxfw_stream_start_simplex(struct snd_oxfw *oxfw); 92e2786ca6STakashi Sakamoto void snd_oxfw_stream_stop_simplex(struct snd_oxfw *oxfw); 93e2786ca6STakashi Sakamoto void snd_oxfw_stream_destroy_simplex(struct snd_oxfw *oxfw); 94e2786ca6STakashi Sakamoto void snd_oxfw_stream_update_simplex(struct snd_oxfw *oxfw); 953713d93aSTakashi Sakamoto 965cd1d3f4STakashi Sakamoto struct snd_oxfw_stream_formation { 975cd1d3f4STakashi Sakamoto unsigned int rate; 985cd1d3f4STakashi Sakamoto unsigned int pcm; 995cd1d3f4STakashi Sakamoto unsigned int midi; 1005cd1d3f4STakashi Sakamoto }; 1015cd1d3f4STakashi Sakamoto int snd_oxfw_stream_parse_format(u8 *format, 1025cd1d3f4STakashi Sakamoto struct snd_oxfw_stream_formation *formation); 1035cd1d3f4STakashi Sakamoto int snd_oxfw_stream_get_current_formation(struct snd_oxfw *oxfw, 1045cd1d3f4STakashi Sakamoto enum avc_general_plug_dir dir, 1055cd1d3f4STakashi Sakamoto struct snd_oxfw_stream_formation *formation); 1065cd1d3f4STakashi Sakamoto int snd_oxfw_stream_discover(struct snd_oxfw *oxfw); 1075cd1d3f4STakashi Sakamoto 1083713d93aSTakashi Sakamoto int snd_oxfw_create_pcm(struct snd_oxfw *oxfw); 10931514bfbSTakashi Sakamoto 11031514bfbSTakashi Sakamoto int snd_oxfw_create_mixer(struct snd_oxfw *oxfw); 111