diff --git a/AudiVal.py b/AudiVal.py
new file mode 100755
index 0000000..7d56c4e
--- /dev/null
+++ b/AudiVal.py
@@ -0,0 +1,247 @@
+#!/usr/bin/env python
+#
+# Audival : Audio Validation Suite for Linux.
+#
+# Author: Harsh Prateek Bora 
+#         <harsh.bora@linaro.org>
+#         <harsh@linux.vnet.ibm.com>
+
+import os
+import sys
+import getopt
+from subprocess import * # for calling external programs
+import commands # deprecated since python 2.6, Python 3.0 uses subprocess
+
+def usage():
+    print "========================================="
+    print "AudiVal: Audio Validation Suite for Linux"
+    print "========================================="
+    print "Usage:"
+    print sys.argv[0], "[--check-info]"
+    print
+    print "Supported HW: PandaBoard (ES), BeagleBoard (XM), i.MX53, i.MX6, Origen, Snowball"
+    sys.exit(1)
+
+SpeakerJack = {
+    'GenuineIntel':     'Analog',
+    'Panda':            'Headset',
+    'Beagle':           'TWL4030',
+    'i.MX53':           'HiFi',
+    'i.MX6':            'HiFi',
+    'ORIGEN':           'Pri_Dai',
+    'Snowball':         'Headset'
+}
+
+MicJack = {
+    'GenuineIntel':     'Analog',
+    'Panda':            'Headset', # not sure though, arecord doesnt work for me!
+    'Beagle':           'TWL4030',
+    'i.MX53':           'HiFi',
+    'i.MX6':            'HiFi',
+    'ORIGEN':           'Pri_Dai',
+    'Snowball':         'Headset'
+}
+
+# As and when HDMI out/in device string differs, we'll need 2 dictionaries.
+HDMI_Audio = {
+    'GenuineIntel':     'HDMI',
+    'Panda':            'HDMI',
+    'Beagle':           'HDMI',
+    'i.MX53':           'HDMI',
+    'i.MX6':            'HDMI', # audio out only supported, audio in not supported.
+    'ORIGEN':           'HDMI',
+    'Snowball':         'hdmi'  # odd one, lowercase
+}
+
+Audio_Devices = {
+    'playback':    'aplay-l.log',
+    'capture':     'arecord-l.log'
+}
+
+def get_device_list(logfile):
+    fobj = open(logfile)
+    return fobj
+
+def get_card_device_info_by_name(devicestr, fobj):
+    """Helper routine to get card, device number by interface name"""
+    optxt = fobj.readlines()
+    card = ""
+    device = ""
+    for line in optxt:
+        if devicestr in line:
+            cardtext, colon, text = line.partition(':')
+            pre, sep, card = cardtext.partition(' ')
+            devtext, colon, text = text.partition(':')
+            pre, sep, device = devtext.partition('device ')
+            break
+    hwstr = 'plughw:' + card + ',' + device
+    if card is "" and device is "":
+        return None
+    return hwstr
+
+def speaker_test_audio_jack(board):
+    fobj = get_device_list(Audio_Devices['playback'])
+    print "speaker-test over audio jack .."
+    headset_jack_id = get_card_device_info_by_name(SpeakerJack[board], fobj)
+    fobj.close()
+    if headset_jack_id is None:
+        print "No Audio Jack found !"
+        return
+    call("date > speaker-test-jack.log", shell=True)
+    cmdstr = "speaker-test -D " + headset_jack_id + " -t s -c 2 -l 1 > speaker-test-jack.log 2>&1"
+    call(cmdstr, shell=True)
+    print "If you heard beeps from left and right speaker, test passed."
+
+def aplay_over_jack(board):
+    fobj = get_device_list(Audio_Devices['playback'])
+    headset_jack_id = get_card_device_info_by_name(SpeakerJack[board], fobj)
+    print "Testing aplay over audio jack .."
+    fobj.close()
+    if headset_jack_id is None:
+        print "No Audio Jack found !"
+        return
+    cmdstr = "aplay login.wav -D " + headset_jack_id
+    call(cmdstr, shell=True)
+    print "If you heard a stereo sound, test passed."
+    # Check dmesg to see if there is an error or I2C error
+    call("dmesg | tail | grep error", shell=True)
+    print "Note: Error, if any, shall be displayed above."
+
+def arecord_and_aplay_over_audio_jack(board):
+    # Record the WAV stream and play it back.
+    fobj = get_device_list(Audio_Devices['capture'])
+    mic_jack_id = get_card_device_info_by_name(MicJack[board], fobj)
+    if mic_jack_id is None:
+        print "No Mic Jack found !"
+        return
+    cmdstr = "arecord -c 2 -f S16_LE -d 10 -r 44100 aud44k16S.wav -D " + mic_jack_id
+    print "Testing arecord over audio jack .."
+    print "Started recording audio over jack for 10 seconds (replay follows) .."
+    call(cmdstr, shell=True)
+    print "Replaying the recorded audio now .."
+    call("aplay aud44k16S.wav", shell=True)
+    # Check dmesg to see if there is an error or I2C error
+    call("dmesg | tail | grep error", shell=True)
+    print "If you heard the recorded audio, test passed."
+    print "Note: Error, if any, shall be displayed above."
+    fobj.close()
+
+def speaker_test_over_hdmi(board):
+    """ speaker-test over HDMI audio interface. """
+    fobj = get_device_list(Audio_Devices['playback'])
+    print "Running speaker-test over HDMI .."
+    # Automatic detection of card,device number for HDMI interface
+    hdmi_hw_id = get_card_device_info_by_name(HDMI_Audio[board], fobj)
+    if hdmi_hw_id is None:
+        print "No HDMI device found !"
+        return
+    cmdstr = "speaker-test -D " + hdmi_hw_id + " -t s -c 2 -l 1 > speaker-test-hdmi.log 2>&1"
+    print "speaker-test over HDMI .."
+    call(cmdstr, shell=True)
+    print "If you heard beeps from left and right speaker, test passed."
+    fobj.close()
+
+def arecord_and_aplay_over_hdmi(board):
+    """ arecord and aplay over HDMI audio interface. """
+    fobj = get_device_list(Audio_Devices['capture'])
+    print "Testing arecord over HDMI .."
+    # Automatic detection of card,device number for HDMI interface
+    hdmi_hw_info = get_card_device_info_by_name(HDMI_Audio[board], fobj)
+    if hdmi_hw_info is None:
+        print "No HDMI device found !"
+        sys.exit(1)
+        return
+    arecord_cmd = "arecord -D " + hdmi_hw_info + " -c 2 -f S16_LE -d 10 -r 44100 aud44k16S.wav"
+    aplay_cmd = "aplay -D " + hdmi_hw_info + " aud44k16S.wav"
+    print "Started recording audio over HDMI for 10 seconds (replay follows).."
+    call(arecord_cmd, shell=True)
+    print "Replaying the recorded audio now .."
+    call(aplay_cmd, shell=True)
+    # Check dmesg to see if there is an error or I2C error
+    call("dmesg | tail | grep error", shell=True)
+    print "If you heard the recorded audio, test passed."
+    print "Note: Error, if any, shall be displayed above."
+    fobj.close()
+
+def mixer_panda():
+    # silently setup mixer using -q
+    call("amixer sset Headset 10 -q", shell=True)
+    call("amixer sset 'Headset Left Playback' 'HS DAC' -q", shell=True)
+    call("amixer sset 'Headset Right Playback' 'HS DAC' -q", shell=True)
+
+def mixer_nop():
+    pass # for unknown mixer settings
+
+MixerSetup = {
+    'GenuineIntel':     mixer_nop,
+    'Panda':            mixer_panda,
+    'Beagle':           mixer_nop,
+    'i.MX53':           mixer_nop,
+    'i.MX6':            mixer_nop,
+    'ORIGEN':           mixer_nop,
+    'Snowball':         mixer_nop
+}
+
+def audio_tests(board):
+    MixerSetup[board]()
+    # minimal speaker test producing a sine wave tone.
+    speaker_test_audio_jack(board)
+
+    # testing alsa with a stereo sound using aplay over jack
+    aplay_over_jack(board);
+    # Record a WAV stream using arecord and play it back over jack.
+    arecord_and_aplay_over_audio_jack(board)
+
+    # speaker-test over HDMI
+    speaker_test_over_hdmi(board) # Need to test, dont have HDMI hw !
+    # arecord and aplay over HDMI
+    arecord_and_aplay_over_hdmi(board) # Need to test, dont have HDMI hw !
+
+
+def check_sound_info():
+    print
+    print "Running alsa-info.sh ..\n"
+    call("alsa-info.sh --stdout", shell=True)
+    print "************************************************\n"
+
+def main():
+    cpuinfo = ["Beagle", "Panda", "i.MX6", "i.MX53", "ORIGEN", "Snowball", "GenuineIntel"]
+    long_options = ["check-info"]
+    runtest = ""
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], "", long_options)
+    except getopt.GetoptError, err:
+        # print help information and exit
+        # will print something like "option -a not recognized"
+        sys.stderr.writelines(str(err)+"\n")
+        usage()
+
+    call("aplay -l > aplay-l.log", shell=True)
+    call("arecord -l > arecord-l.log", shell=True)
+
+    for opt, arg in opts:
+        if opt == '--check-info':
+            print "Checking Sound/Audio related info ..."
+            check_sound_info()
+            sys.exit(0)
+        else:
+            print "unhandled option:", opt
+            usage()
+
+    cpufile = open("/proc/cpuinfo")
+    cputext = cpufile.readlines()
+
+    for line in cputext:
+        for board in cpuinfo:
+            if board in line:
+                print "Hardware Detected: %s" % board
+                print "Running audiotests for %s .." % board
+                audio_tests(board)
+                sys.exit(0)
+
+    print "Err, looks like your hardware is not supported."
+    print "Please report to harsh.bora@linaro.org"
+    sys.exit(1)
+
+if __name__ == "__main__":
+    main()
