28 Mar, 2016

1 commit

  • When sound card is going to be released, dice private data is
    also released. Then all of data should be released. However,
    stream data is not released. This causes memory leak when
    unplugging dice unit.

    This commit fixes the bug.

    Fixes: 4bdc495c87b3('ALSA: dice: handle several PCM substreams when any isochronous streams are available')
    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     

10 Mar, 2016

1 commit


09 Mar, 2016

2 commits

  • This commit enables ALSA dice driver to handle whole available streams.

    In Dice, certain registers represent the number of available streams at
    current sampling transfer frequency for both directions. The parameters
    of each stream are represented in a block of register. This block is
    aligned sequentially. These streams start simultaneously by writing
    enable bit to a register.

    This commit operates these registers when starting/stopping streams.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     
  • Currently ALSA dice driver handles a pair of isochronous resources for
    IEC 61883-1/6 packet streaming. While, according to some documents about
    ASICs named as 'Dice', several isochronous streams are available.

    Here, I start to describe ASICs produced under 'Dice' name.
    * Dice II (designed by wavefront semiconductor, including TCAT's IP)
    * STD (with limited functionality of DTCP)
    * CP (with full functionality of DTCP)
    * TCD2210/2210-E (so-called 'Dice Mini')
    * TCD2220/2220-E (so-called 'Dice Jr.')
    * TCD3070-CH (so-called 'Dice III')

    Some documents are public and we can see hardware design of them. We can
    find some articles about hardware internal register definitions
    (not registers exported to IEEE 1394 bus).

    * DICE II User Guide
    * http://www.tctechnologies.tc/archive/downloads/dice_ii_user_guide.pdf
    * 6.1 AVS Audio Receivers
    * Table 6.1: AVS Audio Receiver Memory Map
    * ARX1-ARX4
    * 6.2 AVS Audio Transmitters
    * Table 6.2: AVS Audio Transmitter Memory Map
    * ATX1, ATX2
    * TCD22xx User Guide
    * http://www.tctechnologies.tc/downloads/tcd22xx_user_guide.pdf
    * 6.1 AVS Audio Receivers
    * Table 66: AVS Audio Receiver Memory Map
    * ARX1, ARX2
    * 6/2 AVS Audio Transmitters
    * Table 67: AVS Audio Transmitter Memory Map
    * ATX1, ATX2
    * DICE III
    * http://www.tctechnologies.tc/downloads/TCD3070-CH.pdf
    * Dual stream 63 channel transmitter/receiver

    For Dice II and TCD22xx series, maximum 16 data channels are transferred in
    an AMDTP packet, while for Dice III, maximum 32 data channels are
    transferred.

    According to the design of the series of these ASICs, this commit allows
    this driver to handle additional set of isochronous resources. For
    practical reason, two pair of isochronous resources are added. As of this
    commit, this driver still use a pair of the first isochronous resources.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     

28 Feb, 2016

1 commit

  • This commit drops implementation of duplex streams synchronization
    from ALSA dice driver, due to a reason of hardware design. This patch
    allows dice-based units to generate sounds correctly when isochronous
    packet streaming starts at first time.

    In IEC 61883-6:2005, CIP packetization layer for AM824 data format
    utilizes the value of SYT field in CIP header of received packet for
    a reference to phase lock loop. Figure 3 in clause 4.3 describes it.
    The value is an offset from cycle_time field of every cycle start packet
    from cycle master on IEEE 1394 bus. The time calculated with these two
    fields is called as 'presentation timestamp' which represents the time
    to play data included in the packet.

    Although, this idea includes some problems due to accuracy of timekeep in
    cycle master, accuracy of transmission of cycle start packet on the bus
    with the other units, accuracy of sampling clock in data transmitter side
    and accuracy of replay in data receiver side. In most case, these
    accuracies somewhat worse because there's no such ideal hardwares in this
    world.

    For the issues, ASICs for Dice include Jitter Elimination Technologies
    (JET) PLL. The PLL can handle several sources of clock and compensate it
    with high-precision internal clock source. The sequence of value in syt
    field of received AMDTP packets is one of the sources, therefore
    transmitters on IEEE 1394 bus should transfer it.

    On the other hand, current ALSA dice driver is programmed with a mode of
    duplex streams with synchronization. In this mode, the driver outputs
    packets after some incoming packets are handled, to re-use the value of
    SYT field in incoming packets to the value for outgoing packets. This mode
    is enabled when source signal of sampling clock is set to internal, and
    this is a major use case. Thus, in most cases, the unit receives no packets
    during a short time after packet streaming starts.

    As long as I experienced, this causes the units to generate no sounds at
    first time to receive packets. This issue occurs only with Dice II. I guess
    this is due to a quirk of the PLL. In short, the PLL cannot generate firm
    signals to ADCs/DACs or the other ICs when no packets are received in the
    beginning of packet streaming. While, on second time or later, the unit
    generates sound correctly. I guess that starting packet streaming at first
    time sets the PLL correctly.

    Well, still based on my hypothesis and no way to prove it, this commit
    drops duplex streams synchronization from this driver. At least, the PLL
    requires the sequence of value in SYT field of received AMDTP packets as
    one of source of clock signals with internal clock source.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     

12 Feb, 2016

1 commit

  • As long as I tested, Dice-based models produced by TC Electronic with
    factory-configured settings transfer no notification within
    ensure_phase_lock(). On the other hand, with upgraded firmwares, it
    starts to transfer the notification. This seems to be a quirk of earlier
    firmwares.

    This commit ensures phase lock by reading a register after waiting for
    the notification. Even if it's timed-out, ensure_phase_lock() return
    success as long as the register has expected clock status.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     

09 Feb, 2016

3 commits

  • In former commits, probing process has no need to set sampling transfer
    frequency. Although it's OK to drop a function to change the frequency
    from this module, some models require it before streaming. This seems to
    be due to phase lock of clock source.

    This commit moves the function from transaction layer to stream layer, and
    rename it according to the purpose.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     
  • Dice interface design doesn't allow drivers to read supported combination
    between sampling transfer frequencies and the number of Multi bit linear
    audio data channels. Due to the design, ALSA dice driver changes current
    sampling transfer frequency to generate cache of the combinations at
    device probing processing.

    Although, this idea is worse because ALSA dice driver changes the state of
    clock. This is not what users want when they save favorite configuration
    to the device in advance.

    Furthermore, there's a possibility that the format of data block is decided
    not only according to current sampling transfer frequency, but also the
    other factors, i.e. data format for digital interface. It's not good to
    generate channel cache according to the sampling transfer frequency only.

    This commit purges processing cache data and related structure members. As
    a result, users must set preferable sampling transfer frequency before
    using ALSA PCM applications, as long as they want to start any PCM
    substreams at the rate except for current one.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     
  • In previous commit, ALSA Dice driver limits PCM substreams at current
    sampling transfer frequency and current number of Multi bit linear audio
    data channel. Thus, the driver has no need to start AMDTP streams at
    the other sampling transfer frequency except for current one. This is due
    to Dice interface design.

    This commit limits AMDTP stream at current sampling transfer frequency,
    according to the design.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     

19 Oct, 2015

1 commit

  • Some local variables in some functions are typed as unsigned int, while
    __be32 value is assigned to them. This causes sparse warnings.

    dice-stream.c:50:17: warning: incorrect type in assignment (different base types)
    dice-stream.c:50:17: expected unsigned int [unsigned] channel
    dice-stream.c:50:17: got restricted __be32 [usertype]
    dice-stream.c:74:17: warning: incorrect type in assignment (different base types)
    dice-stream.c:74:17: expected unsigned int [unsigned] channel
    dice-stream.c:74:17: got restricted __be32 [usertype]

    This commit fixes this bug.

    Fixes: 288a8d0cb04f('ALSA: dice: Change the way to start stream')
    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     

29 Sep, 2015

5 commits

  • In IEC 61883-6, several types of data are available in AM824 format. The
    data is transferred in each data channel. The position of data channel in
    data block differs depending on model.

    Current implementation has an array to map the index of data channel in an
    data block to the position of actual data channel. The implementation
    allows each driver to access the mapping directly.

    In later commit, the mapping is in specific structure pushed into an
    opaque pointer. Helper functions are required.

    This commit adds the helper functions for this purpose. In IEC 61883-6,
    AM824 format supports many data types, while this specification easily
    causes over-engineering. Current AM824 implementation is allowed to handle
    two types of data, Multi Bit Linear Audio data (=PCM samples) and MIDI
    conformant data (=MIDI messages).

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     
  • The value of FDF field in CIP header is protocol-dependent. Thus, it's
    better to allow data block processing layer to decide the value in any
    timing.

    In AM824 data format, the value of FDF field in CIP header indicates
    N-flag and Nominal Sampling Frequency Code (sfc). The N-flag is for
    switching 'Clock-based rate control mode' and 'Command-based rate control
    mode'. In our implementation, 'Clock-based rate control mode' is just
    supported. Therefore, When sampling transfer frequency is decided, then
    the FDF can be set.

    This commit replaces 'amdtp_stream_set_parameters' with
    'amdtp_am824_set_parameters' to set the FDF. This is the same timing
    to decide the ration between the number of data blocks and the number of
    PCM frames.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     
  • This commit adds data block processing layer for AM824 format. The new
    layer initializes streaming layer with its value for fmt field.

    Currently, most implementation of data block processing still remains
    streaming layer. In later commits, these codes will be moved to the layer.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     
  • In IEC 61883-6, one data block represents one event. In ALSA, the event is
    one PCM frame. Therefore, when processing one data block, current
    implementation counts one PCM frame.

    On the other hand, Dice platform has a quirk called as 'dual wire' at
    higher sampling rate. In detail, see comment of commit 6eb6c81eee2a
    ("ALSA: dice: Split stream functionality into a file").

    Currently, to handle this quirk, AMDTP stream structure has a
    'double_pcm_frames' member. When this is enabled, two PCM frames are
    counted. Each driver set this flag by accessing the structure member
    directly.

    In future commit, some members related to AM824 data block will be moved
    to specific structure, to separate packet streaming layer and data block
    processing layer. The access will be limited by opaque pointer.

    For this reason, this commit adds an argument into
    amdtp_stream_set_parameter() to set the flag.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     
  • Currently, amdtp_stream_set_parameters() returns no error even if wrong
    arguments are given. This is not good for streaming layer because drivers
    can continue processing ignoring capability of streaming layer.

    This commit changes this function to return error code.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     

23 Feb, 2015

1 commit

  • Currently stream destructor in each driver has a problem to be called in
    a context in which sound card object is released, because the destructors
    call amdtp_stream_pcm_abort() and touch PCM runtime data.

    The PCM runtime data is destroyed in application's context with
    snd_pcm_close(), on the other hand PCM substream data is destroyed after
    sound card object is released, in most case after all of ALSA character
    devices are released. When PCM runtime is destroyed and PCM substream is
    remained, amdtp_stream_pcm_abort() touches PCM runtime data and causes
    Null-pointer-dereference.

    This commit changes stream destructors and allows each driver to call
    it after releasing runtime.

    Signed-off-by: Takashi Sakamoto
    Cc: # 3.19+
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     

10 Dec, 2014

4 commits

  • This commit adds a support for MIDI capture/playback

    When MIDI substrams already start streaming and PCM substreams are going to
    join at different sampling rate, streams are stopped once. Then sampling rate
    is changed and streams are restarted.

    Signed-off-by: Takashi Sakamoto
    Acked-by: Clemens Ladisch
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     
  • This commit allows this driver to handle devices with non SYT-Match
    sampling clock source.

    When sampling clock source is SYT-Match mode, devices handle
    'presentation timestamp' in received packets and generates sampling clock
    according to the information. In this case, driver is synchronization master
    and must transfer correct value in SYT field of each packets in outgoing
    stream, then the outgoing stream is a master stream.

    On the other hand, non SYT-Match mode, devices do this. So drivers must pick
    up the value in SYT field of incoming packets and use the value for outgoing
    stream. Currently firewire-lib module achieve this work.

    Furthermore, without SYT-Match and internal clock source, the sampling rate
    should be fixed for the other devices connected to the handled device. This
    commit add a restriction of sampling rate at this situation.

    With these implementations, this driver has no need to set clock source.
    This commit remove set function.

    Signed-off-by: Takashi Sakamoto
    Acked-by: Clemens Ladisch
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     
  • This commit adds support for AMDTP in-stream. As a result, Dice driver
    supports full duplex streams with synchronization.

    AMDTP can transfer timestamps in its packets. By handling the timestamp,
    devices can synchronize to the other devices or drivers on the same bus.

    When Dice chipset is 'enabled', it starts streams with correct settings.
    This 'enable' register is global, thus, when a stream is started to run,
    an opposite stream can't start unless turning off 'enable'. Therefore
    a pair of streams must be running. This causes a loss of CPU usage when
    single stream is needed for neither playbacking or capturing.

    This commit assumes that playback-only models also have a functionality
    to transmit stream for delivering timestamps.

    Currently, sampling clock source is restricted to SYT-Match mode. This is
    improved in followed commit. I note that at SYT-Match mode, Dice can select
    from 4 streams for synchronization but this driver uses the 1st stream only
    for simplicity.

    Signed-off-by: Takashi Sakamoto
    Acked-by: Clemens Ladisch
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     
  • Streaming functionality can start streams when rate is given but currently
    some codes are in PCM functionality.

    This commit changes the way to start stream and add some arrangement
    to make it easy to understand the way.

    Signed-off-by: Takashi Sakamoto
    Acked-by: Clemens Ladisch
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     

30 Nov, 2014

2 commits

  • This commit adds a file and move some codes related to PCM functionality.

    Currently PCM playback is supported. PCM capture will be supported in followed
    commits.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto
     
  • This commit adds a file with some helper functions for streaming, and move some
    codes into the file with some arrangements.

    Well-known CMP is not used to start/stop streams for Dice chipset. It's
    achieved by writing to specific address. We call this way as 'enable'.
    When devices are 'enabled', streaming starts in registered isochronous channel.
    Some helper functions are already implemented in previous commit.

    Basically, the stream is compliant to IEC 61883-6, so-called as AMDTP. But Dice
    has a specific quirk, so called-as 'Dual Wire'. This quirk is applied at
    176.4/192.0kHz. In this mode, each packet includes double number of events than
    number in the specification, and stream runs at a half of sampling rate.

    There is another quirk at bus reset. Dice chipset handles drivers' request but
    don't re-enable streaming. So stream should be stopped.

    Signed-off-by: Takashi Sakamoto
    Signed-off-by: Takashi Iwai

    Takashi Sakamoto