linux/sound/pci/asihpi/hpifunc.c
<<
>>
Prefs
   1
   2#include "hpi_internal.h"
   3#include "hpimsginit.h"
   4
   5#include "hpidebug.h"
   6
   7struct hpi_handle {
   8        unsigned int obj_index:12;
   9        unsigned int obj_type:4;
  10        unsigned int adapter_index:14;
  11        unsigned int spare:1;
  12        unsigned int read_only:1;
  13};
  14
  15union handle_word {
  16        struct hpi_handle h;
  17        u32 w;
  18};
  19
  20u32 hpi_indexes_to_handle(const char c_object, const u16 adapter_index,
  21        const u16 object_index)
  22{
  23        union handle_word handle;
  24
  25        handle.h.adapter_index = adapter_index;
  26        handle.h.spare = 0;
  27        handle.h.read_only = 0;
  28        handle.h.obj_type = c_object;
  29        handle.h.obj_index = object_index;
  30        return handle.w;
  31}
  32
  33static u16 hpi_handle_indexes(const u32 h, u16 *p1, u16 *p2)
  34{
  35        union handle_word uhandle;
  36        if (!h)
  37                return HPI_ERROR_INVALID_HANDLE;
  38
  39        uhandle.w = h;
  40
  41        *p1 = (u16)uhandle.h.adapter_index;
  42        if (p2)
  43                *p2 = (u16)uhandle.h.obj_index;
  44
  45        return 0;
  46}
  47
  48void hpi_handle_to_indexes(const u32 handle, u16 *pw_adapter_index,
  49        u16 *pw_object_index)
  50{
  51        hpi_handle_indexes(handle, pw_adapter_index, pw_object_index);
  52}
  53
  54char hpi_handle_object(const u32 handle)
  55{
  56        union handle_word uhandle;
  57        uhandle.w = handle;
  58        return (char)uhandle.h.obj_type;
  59}
  60
  61void hpi_format_to_msg(struct hpi_msg_format *pMF,
  62        const struct hpi_format *pF)
  63{
  64        pMF->sample_rate = pF->sample_rate;
  65        pMF->bit_rate = pF->bit_rate;
  66        pMF->attributes = pF->attributes;
  67        pMF->channels = pF->channels;
  68        pMF->format = pF->format;
  69}
  70
  71static void hpi_msg_to_format(struct hpi_format *pF,
  72        struct hpi_msg_format *pMF)
  73{
  74        pF->sample_rate = pMF->sample_rate;
  75        pF->bit_rate = pMF->bit_rate;
  76        pF->attributes = pMF->attributes;
  77        pF->channels = pMF->channels;
  78        pF->format = pMF->format;
  79        pF->mode_legacy = 0;
  80        pF->unused = 0;
  81}
  82
  83void hpi_stream_response_to_legacy(struct hpi_stream_res *pSR)
  84{
  85        pSR->u.legacy_stream_info.auxiliary_data_available =
  86                pSR->u.stream_info.auxiliary_data_available;
  87        pSR->u.legacy_stream_info.state = pSR->u.stream_info.state;
  88}
  89
  90static inline void hpi_send_recvV1(struct hpi_message_header *m,
  91        struct hpi_response_header *r)
  92{
  93        hpi_send_recv((struct hpi_message *)m, (struct hpi_response *)r);
  94}
  95
  96u16 hpi_subsys_get_version_ex(u32 *pversion_ex)
  97{
  98        struct hpi_message hm;
  99        struct hpi_response hr;
 100
 101        hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM,
 102                HPI_SUBSYS_GET_VERSION);
 103        hpi_send_recv(&hm, &hr);
 104        *pversion_ex = hr.u.s.data;
 105        return hr.error;
 106}
 107
 108u16 hpi_subsys_create_adapter(const struct hpi_resource *p_resource,
 109        u16 *pw_adapter_index)
 110{
 111        struct hpi_message hm;
 112        struct hpi_response hr;
 113
 114        hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM,
 115                HPI_SUBSYS_CREATE_ADAPTER);
 116        hm.u.s.resource = *p_resource;
 117
 118        hpi_send_recv(&hm, &hr);
 119
 120        *pw_adapter_index = hr.u.s.adapter_index;
 121        return hr.error;
 122}
 123
 124u16 hpi_subsys_delete_adapter(u16 adapter_index)
 125{
 126        struct hpi_message hm;
 127        struct hpi_response hr;
 128        hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM,
 129                HPI_SUBSYS_DELETE_ADAPTER);
 130        hm.obj_index = adapter_index;
 131        hpi_send_recv(&hm, &hr);
 132        return hr.error;
 133}
 134
 135u16 hpi_subsys_get_num_adapters(int *pn_num_adapters)
 136{
 137        struct hpi_message hm;
 138        struct hpi_response hr;
 139        hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM,
 140                HPI_SUBSYS_GET_NUM_ADAPTERS);
 141        hpi_send_recv(&hm, &hr);
 142        *pn_num_adapters = (int)hr.u.s.num_adapters;
 143        return hr.error;
 144}
 145
 146u16 hpi_subsys_get_adapter(int iterator, u32 *padapter_index,
 147        u16 *pw_adapter_type)
 148{
 149        struct hpi_message hm;
 150        struct hpi_response hr;
 151        hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM,
 152                HPI_SUBSYS_GET_ADAPTER);
 153        hm.obj_index = (u16)iterator;
 154        hpi_send_recv(&hm, &hr);
 155        *padapter_index = (int)hr.u.s.adapter_index;
 156        *pw_adapter_type = hr.u.s.adapter_type;
 157
 158        return hr.error;
 159}
 160
 161u16 hpi_adapter_open(u16 adapter_index)
 162{
 163        struct hpi_message hm;
 164        struct hpi_response hr;
 165        hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
 166                HPI_ADAPTER_OPEN);
 167        hm.adapter_index = adapter_index;
 168
 169        hpi_send_recv(&hm, &hr);
 170
 171        return hr.error;
 172
 173}
 174
 175u16 hpi_adapter_close(u16 adapter_index)
 176{
 177        struct hpi_message hm;
 178        struct hpi_response hr;
 179        hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
 180                HPI_ADAPTER_CLOSE);
 181        hm.adapter_index = adapter_index;
 182
 183        hpi_send_recv(&hm, &hr);
 184
 185        return hr.error;
 186}
 187
 188u16 hpi_adapter_set_mode(u16 adapter_index, u32 adapter_mode)
 189{
 190        return hpi_adapter_set_mode_ex(adapter_index, adapter_mode,
 191                HPI_ADAPTER_MODE_SET);
 192}
 193
 194u16 hpi_adapter_set_mode_ex(u16 adapter_index, u32 adapter_mode,
 195        u16 query_or_set)
 196{
 197        struct hpi_message hm;
 198        struct hpi_response hr;
 199
 200        hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
 201                HPI_ADAPTER_SET_MODE);
 202        hm.adapter_index = adapter_index;
 203        hm.u.ax.mode.adapter_mode = adapter_mode;
 204        hm.u.ax.mode.query_or_set = query_or_set;
 205        hpi_send_recv(&hm, &hr);
 206        return hr.error;
 207}
 208
 209u16 hpi_adapter_get_mode(u16 adapter_index, u32 *padapter_mode)
 210{
 211        struct hpi_message hm;
 212        struct hpi_response hr;
 213        hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
 214                HPI_ADAPTER_GET_MODE);
 215        hm.adapter_index = adapter_index;
 216        hpi_send_recv(&hm, &hr);
 217        if (padapter_mode)
 218                *padapter_mode = hr.u.ax.mode.adapter_mode;
 219        return hr.error;
 220}
 221
 222u16 hpi_adapter_get_info(u16 adapter_index, u16 *pw_num_outstreams,
 223        u16 *pw_num_instreams, u16 *pw_version, u32 *pserial_number,
 224        u16 *pw_adapter_type)
 225{
 226        struct hpi_message hm;
 227        struct hpi_response hr;
 228        hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
 229                HPI_ADAPTER_GET_INFO);
 230        hm.adapter_index = adapter_index;
 231
 232        hpi_send_recv(&hm, &hr);
 233
 234        *pw_adapter_type = hr.u.ax.info.adapter_type;
 235        *pw_num_outstreams = hr.u.ax.info.num_outstreams;
 236        *pw_num_instreams = hr.u.ax.info.num_instreams;
 237        *pw_version = hr.u.ax.info.version;
 238        *pserial_number = hr.u.ax.info.serial_number;
 239        return hr.error;
 240}
 241
 242u16 hpi_adapter_get_module_by_index(u16 adapter_index, u16 module_index,
 243        u16 *pw_num_outputs, u16 *pw_num_inputs, u16 *pw_version,
 244        u32 *pserial_number, u16 *pw_module_type, u32 *ph_module)
 245{
 246        struct hpi_message hm;
 247        struct hpi_response hr;
 248
 249        hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
 250                HPI_ADAPTER_MODULE_INFO);
 251        hm.adapter_index = adapter_index;
 252        hm.u.ax.module_info.index = module_index;
 253
 254        hpi_send_recv(&hm, &hr);
 255
 256        *pw_module_type = hr.u.ax.info.adapter_type;
 257        *pw_num_outputs = hr.u.ax.info.num_outstreams;
 258        *pw_num_inputs = hr.u.ax.info.num_instreams;
 259        *pw_version = hr.u.ax.info.version;
 260        *pserial_number = hr.u.ax.info.serial_number;
 261        *ph_module = 0;
 262
 263        return hr.error;
 264}
 265
 266u16 hpi_adapter_set_property(u16 adapter_index, u16 property, u16 parameter1,
 267        u16 parameter2)
 268{
 269        struct hpi_message hm;
 270        struct hpi_response hr;
 271        hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
 272                HPI_ADAPTER_SET_PROPERTY);
 273        hm.adapter_index = adapter_index;
 274        hm.u.ax.property_set.property = property;
 275        hm.u.ax.property_set.parameter1 = parameter1;
 276        hm.u.ax.property_set.parameter2 = parameter2;
 277
 278        hpi_send_recv(&hm, &hr);
 279
 280        return hr.error;
 281}
 282
 283u16 hpi_adapter_get_property(u16 adapter_index, u16 property,
 284        u16 *pw_parameter1, u16 *pw_parameter2)
 285{
 286        struct hpi_message hm;
 287        struct hpi_response hr;
 288        hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
 289                HPI_ADAPTER_GET_PROPERTY);
 290        hm.adapter_index = adapter_index;
 291        hm.u.ax.property_set.property = property;
 292
 293        hpi_send_recv(&hm, &hr);
 294        if (!hr.error) {
 295                if (pw_parameter1)
 296                        *pw_parameter1 = hr.u.ax.property_get.parameter1;
 297                if (pw_parameter2)
 298                        *pw_parameter2 = hr.u.ax.property_get.parameter2;
 299        }
 300
 301        return hr.error;
 302}
 303
 304u16 hpi_adapter_enumerate_property(u16 adapter_index, u16 index,
 305        u16 what_to_enumerate, u16 property_index, u32 *psetting)
 306{
 307        return 0;
 308}
 309
 310u16 hpi_format_create(struct hpi_format *p_format, u16 channels, u16 format,
 311        u32 sample_rate, u32 bit_rate, u32 attributes)
 312{
 313        u16 err = 0;
 314        struct hpi_msg_format fmt;
 315
 316        switch (channels) {
 317        case 1:
 318        case 2:
 319        case 4:
 320        case 6:
 321        case 8:
 322        case 16:
 323                break;
 324        default:
 325                err = HPI_ERROR_INVALID_CHANNELS;
 326                return err;
 327        }
 328        fmt.channels = channels;
 329
 330        switch (format) {
 331        case HPI_FORMAT_PCM16_SIGNED:
 332        case HPI_FORMAT_PCM24_SIGNED:
 333        case HPI_FORMAT_PCM32_SIGNED:
 334        case HPI_FORMAT_PCM32_FLOAT:
 335        case HPI_FORMAT_PCM16_BIGENDIAN:
 336        case HPI_FORMAT_PCM8_UNSIGNED:
 337        case HPI_FORMAT_MPEG_L1:
 338        case HPI_FORMAT_MPEG_L2:
 339        case HPI_FORMAT_MPEG_L3:
 340        case HPI_FORMAT_DOLBY_AC2:
 341        case HPI_FORMAT_AA_TAGIT1_HITS:
 342        case HPI_FORMAT_AA_TAGIT1_INSERTS:
 343        case HPI_FORMAT_RAW_BITSTREAM:
 344        case HPI_FORMAT_AA_TAGIT1_HITS_EX1:
 345        case HPI_FORMAT_OEM1:
 346        case HPI_FORMAT_OEM2:
 347                break;
 348        default:
 349                err = HPI_ERROR_INVALID_FORMAT;
 350                return err;
 351        }
 352        fmt.format = format;
 353
 354        if (sample_rate < 8000L) {
 355                err = HPI_ERROR_INCOMPATIBLE_SAMPLERATE;
 356                sample_rate = 8000L;
 357        }
 358        if (sample_rate > 200000L) {
 359                err = HPI_ERROR_INCOMPATIBLE_SAMPLERATE;
 360                sample_rate = 200000L;
 361        }
 362        fmt.sample_rate = sample_rate;
 363
 364        switch (format) {
 365        case HPI_FORMAT_MPEG_L1:
 366        case HPI_FORMAT_MPEG_L2:
 367        case HPI_FORMAT_MPEG_L3:
 368                fmt.bit_rate = bit_rate;
 369                break;
 370        case HPI_FORMAT_PCM16_SIGNED:
 371        case HPI_FORMAT_PCM16_BIGENDIAN:
 372                fmt.bit_rate = channels * sample_rate * 2;
 373                break;
 374        case HPI_FORMAT_PCM32_SIGNED:
 375        case HPI_FORMAT_PCM32_FLOAT:
 376                fmt.bit_rate = channels * sample_rate * 4;
 377                break;
 378        case HPI_FORMAT_PCM8_UNSIGNED:
 379                fmt.bit_rate = channels * sample_rate;
 380                break;
 381        default:
 382                fmt.bit_rate = 0;
 383        }
 384
 385        switch (format) {
 386        case HPI_FORMAT_MPEG_L2:
 387                if ((channels == 1)
 388                        && (attributes != HPI_MPEG_MODE_DEFAULT)) {
 389                        attributes = HPI_MPEG_MODE_DEFAULT;
 390                        err = HPI_ERROR_INVALID_FORMAT;
 391                } else if (attributes > HPI_MPEG_MODE_DUALCHANNEL) {
 392                        attributes = HPI_MPEG_MODE_DEFAULT;
 393                        err = HPI_ERROR_INVALID_FORMAT;
 394                }
 395                fmt.attributes = attributes;
 396                break;
 397        default:
 398                fmt.attributes = attributes;
 399        }
 400
 401        hpi_msg_to_format(p_format, &fmt);
 402        return err;
 403}
 404
 405u16 hpi_stream_estimate_buffer_size(struct hpi_format *p_format,
 406        u32 host_polling_rate_in_milli_seconds, u32 *recommended_buffer_size)
 407{
 408
 409        u32 bytes_per_second;
 410        u32 size;
 411        u16 channels;
 412        struct hpi_format *pF = p_format;
 413
 414        channels = pF->channels;
 415
 416        switch (pF->format) {
 417        case HPI_FORMAT_PCM16_BIGENDIAN:
 418        case HPI_FORMAT_PCM16_SIGNED:
 419                bytes_per_second = pF->sample_rate * 2L * channels;
 420                break;
 421        case HPI_FORMAT_PCM24_SIGNED:
 422                bytes_per_second = pF->sample_rate * 3L * channels;
 423                break;
 424        case HPI_FORMAT_PCM32_SIGNED:
 425        case HPI_FORMAT_PCM32_FLOAT:
 426                bytes_per_second = pF->sample_rate * 4L * channels;
 427                break;
 428        case HPI_FORMAT_PCM8_UNSIGNED:
 429                bytes_per_second = pF->sample_rate * 1L * channels;
 430                break;
 431        case HPI_FORMAT_MPEG_L1:
 432        case HPI_FORMAT_MPEG_L2:
 433        case HPI_FORMAT_MPEG_L3:
 434                bytes_per_second = pF->bit_rate / 8L;
 435                break;
 436        case HPI_FORMAT_DOLBY_AC2:
 437
 438                bytes_per_second = 256000L / 8L;
 439                break;
 440        default:
 441                return HPI_ERROR_INVALID_FORMAT;
 442        }
 443        size = (bytes_per_second * host_polling_rate_in_milli_seconds * 2) /
 444                1000L;
 445
 446        *recommended_buffer_size =
 447                roundup_pow_of_two(((size + 4095L) & ~4095L));
 448        return 0;
 449}
 450
 451u16 hpi_outstream_open(u16 adapter_index, u16 outstream_index,
 452        u32 *ph_outstream)
 453{
 454        struct hpi_message hm;
 455        struct hpi_response hr;
 456        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 457                HPI_OSTREAM_OPEN);
 458        hm.adapter_index = adapter_index;
 459        hm.obj_index = outstream_index;
 460
 461        hpi_send_recv(&hm, &hr);
 462
 463        if (hr.error == 0)
 464                *ph_outstream =
 465                        hpi_indexes_to_handle(HPI_OBJ_OSTREAM, adapter_index,
 466                        outstream_index);
 467        else
 468                *ph_outstream = 0;
 469        return hr.error;
 470}
 471
 472u16 hpi_outstream_close(u32 h_outstream)
 473{
 474        struct hpi_message hm;
 475        struct hpi_response hr;
 476
 477        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 478                HPI_OSTREAM_HOSTBUFFER_FREE);
 479        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 480                return HPI_ERROR_INVALID_HANDLE;
 481
 482        hpi_send_recv(&hm, &hr);
 483
 484        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 485                HPI_OSTREAM_GROUP_RESET);
 486        hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index);
 487        hpi_send_recv(&hm, &hr);
 488
 489        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 490                HPI_OSTREAM_CLOSE);
 491        hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index);
 492        hpi_send_recv(&hm, &hr);
 493
 494        return hr.error;
 495}
 496
 497u16 hpi_outstream_get_info_ex(u32 h_outstream, u16 *pw_state,
 498        u32 *pbuffer_size, u32 *pdata_to_play, u32 *psamples_played,
 499        u32 *pauxiliary_data_to_play)
 500{
 501        struct hpi_message hm;
 502        struct hpi_response hr;
 503        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 504                HPI_OSTREAM_GET_INFO);
 505        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 506                return HPI_ERROR_INVALID_HANDLE;
 507
 508        hpi_send_recv(&hm, &hr);
 509
 510        if (pw_state)
 511                *pw_state = hr.u.d.u.stream_info.state;
 512        if (pbuffer_size)
 513                *pbuffer_size = hr.u.d.u.stream_info.buffer_size;
 514        if (pdata_to_play)
 515                *pdata_to_play = hr.u.d.u.stream_info.data_available;
 516        if (psamples_played)
 517                *psamples_played = hr.u.d.u.stream_info.samples_transferred;
 518        if (pauxiliary_data_to_play)
 519                *pauxiliary_data_to_play =
 520                        hr.u.d.u.stream_info.auxiliary_data_available;
 521        return hr.error;
 522}
 523
 524u16 hpi_outstream_write_buf(u32 h_outstream, const u8 *pb_data,
 525        u32 bytes_to_write, const struct hpi_format *p_format)
 526{
 527        struct hpi_message hm;
 528        struct hpi_response hr;
 529        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 530                HPI_OSTREAM_WRITE);
 531        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 532                return HPI_ERROR_INVALID_HANDLE;
 533        hm.u.d.u.data.pb_data = (u8 *)pb_data;
 534        hm.u.d.u.data.data_size = bytes_to_write;
 535
 536        hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
 537
 538        hpi_send_recv(&hm, &hr);
 539
 540        return hr.error;
 541}
 542
 543u16 hpi_outstream_start(u32 h_outstream)
 544{
 545        struct hpi_message hm;
 546        struct hpi_response hr;
 547        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 548                HPI_OSTREAM_START);
 549        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 550                return HPI_ERROR_INVALID_HANDLE;
 551
 552        hpi_send_recv(&hm, &hr);
 553
 554        return hr.error;
 555}
 556
 557u16 hpi_outstream_wait_start(u32 h_outstream)
 558{
 559        struct hpi_message hm;
 560        struct hpi_response hr;
 561        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 562                HPI_OSTREAM_WAIT_START);
 563        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 564                return HPI_ERROR_INVALID_HANDLE;
 565
 566        hpi_send_recv(&hm, &hr);
 567
 568        return hr.error;
 569}
 570
 571u16 hpi_outstream_stop(u32 h_outstream)
 572{
 573        struct hpi_message hm;
 574        struct hpi_response hr;
 575        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 576                HPI_OSTREAM_STOP);
 577        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 578                return HPI_ERROR_INVALID_HANDLE;
 579
 580        hpi_send_recv(&hm, &hr);
 581
 582        return hr.error;
 583}
 584
 585u16 hpi_outstream_sinegen(u32 h_outstream)
 586{
 587        struct hpi_message hm;
 588        struct hpi_response hr;
 589        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 590                HPI_OSTREAM_SINEGEN);
 591        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 592                return HPI_ERROR_INVALID_HANDLE;
 593
 594        hpi_send_recv(&hm, &hr);
 595
 596        return hr.error;
 597}
 598
 599u16 hpi_outstream_reset(u32 h_outstream)
 600{
 601        struct hpi_message hm;
 602        struct hpi_response hr;
 603        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 604                HPI_OSTREAM_RESET);
 605        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 606                return HPI_ERROR_INVALID_HANDLE;
 607
 608        hpi_send_recv(&hm, &hr);
 609
 610        return hr.error;
 611}
 612
 613u16 hpi_outstream_query_format(u32 h_outstream, struct hpi_format *p_format)
 614{
 615        struct hpi_message hm;
 616        struct hpi_response hr;
 617
 618        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 619                HPI_OSTREAM_QUERY_FORMAT);
 620        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 621                return HPI_ERROR_INVALID_HANDLE;
 622
 623        hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
 624
 625        hpi_send_recv(&hm, &hr);
 626
 627        return hr.error;
 628}
 629
 630u16 hpi_outstream_set_format(u32 h_outstream, struct hpi_format *p_format)
 631{
 632        struct hpi_message hm;
 633        struct hpi_response hr;
 634
 635        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 636                HPI_OSTREAM_SET_FORMAT);
 637        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 638                return HPI_ERROR_INVALID_HANDLE;
 639
 640        hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
 641
 642        hpi_send_recv(&hm, &hr);
 643
 644        return hr.error;
 645}
 646
 647u16 hpi_outstream_set_velocity(u32 h_outstream, short velocity)
 648{
 649        struct hpi_message hm;
 650        struct hpi_response hr;
 651
 652        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 653                HPI_OSTREAM_SET_VELOCITY);
 654        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 655                return HPI_ERROR_INVALID_HANDLE;
 656        hm.u.d.u.velocity = velocity;
 657
 658        hpi_send_recv(&hm, &hr);
 659
 660        return hr.error;
 661}
 662
 663u16 hpi_outstream_set_punch_in_out(u32 h_outstream, u32 punch_in_sample,
 664        u32 punch_out_sample)
 665{
 666        struct hpi_message hm;
 667        struct hpi_response hr;
 668
 669        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 670                HPI_OSTREAM_SET_PUNCHINOUT);
 671        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 672                return HPI_ERROR_INVALID_HANDLE;
 673
 674        hm.u.d.u.pio.punch_in_sample = punch_in_sample;
 675        hm.u.d.u.pio.punch_out_sample = punch_out_sample;
 676
 677        hpi_send_recv(&hm, &hr);
 678
 679        return hr.error;
 680}
 681
 682u16 hpi_outstream_ancillary_reset(u32 h_outstream, u16 mode)
 683{
 684        struct hpi_message hm;
 685        struct hpi_response hr;
 686
 687        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 688                HPI_OSTREAM_ANC_RESET);
 689        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 690                return HPI_ERROR_INVALID_HANDLE;
 691        hm.u.d.u.data.format.channels = mode;
 692        hpi_send_recv(&hm, &hr);
 693        return hr.error;
 694}
 695
 696u16 hpi_outstream_ancillary_get_info(u32 h_outstream, u32 *pframes_available)
 697{
 698        struct hpi_message hm;
 699        struct hpi_response hr;
 700
 701        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 702                HPI_OSTREAM_ANC_GET_INFO);
 703        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 704                return HPI_ERROR_INVALID_HANDLE;
 705        hpi_send_recv(&hm, &hr);
 706        if (hr.error == 0) {
 707                if (pframes_available)
 708                        *pframes_available =
 709                                hr.u.d.u.stream_info.data_available /
 710                                sizeof(struct hpi_anc_frame);
 711        }
 712        return hr.error;
 713}
 714
 715u16 hpi_outstream_ancillary_read(u32 h_outstream,
 716        struct hpi_anc_frame *p_anc_frame_buffer,
 717        u32 anc_frame_buffer_size_in_bytes,
 718        u32 number_of_ancillary_frames_to_read)
 719{
 720        struct hpi_message hm;
 721        struct hpi_response hr;
 722
 723        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 724                HPI_OSTREAM_ANC_READ);
 725        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 726                return HPI_ERROR_INVALID_HANDLE;
 727        hm.u.d.u.data.pb_data = (u8 *)p_anc_frame_buffer;
 728        hm.u.d.u.data.data_size =
 729                number_of_ancillary_frames_to_read *
 730                sizeof(struct hpi_anc_frame);
 731        if (hm.u.d.u.data.data_size <= anc_frame_buffer_size_in_bytes)
 732                hpi_send_recv(&hm, &hr);
 733        else
 734                hr.error = HPI_ERROR_INVALID_DATASIZE;
 735        return hr.error;
 736}
 737
 738u16 hpi_outstream_set_time_scale(u32 h_outstream, u32 time_scale)
 739{
 740        struct hpi_message hm;
 741        struct hpi_response hr;
 742
 743        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 744                HPI_OSTREAM_SET_TIMESCALE);
 745        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 746                return HPI_ERROR_INVALID_HANDLE;
 747
 748        hm.u.d.u.time_scale = time_scale;
 749
 750        hpi_send_recv(&hm, &hr);
 751
 752        return hr.error;
 753}
 754
 755u16 hpi_outstream_host_buffer_allocate(u32 h_outstream, u32 size_in_bytes)
 756{
 757        struct hpi_message hm;
 758        struct hpi_response hr;
 759
 760        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 761                HPI_OSTREAM_HOSTBUFFER_ALLOC);
 762        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 763                return HPI_ERROR_INVALID_HANDLE;
 764        hm.u.d.u.data.data_size = size_in_bytes;
 765        hpi_send_recv(&hm, &hr);
 766        return hr.error;
 767}
 768
 769u16 hpi_outstream_host_buffer_get_info(u32 h_outstream, u8 **pp_buffer,
 770        struct hpi_hostbuffer_status **pp_status)
 771{
 772        struct hpi_message hm;
 773        struct hpi_response hr;
 774
 775        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 776                HPI_OSTREAM_HOSTBUFFER_GET_INFO);
 777        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 778                return HPI_ERROR_INVALID_HANDLE;
 779        hpi_send_recv(&hm, &hr);
 780
 781        if (hr.error == 0) {
 782                if (pp_buffer)
 783                        *pp_buffer = hr.u.d.u.hostbuffer_info.p_buffer;
 784                if (pp_status)
 785                        *pp_status = hr.u.d.u.hostbuffer_info.p_status;
 786        }
 787        return hr.error;
 788}
 789
 790u16 hpi_outstream_host_buffer_free(u32 h_outstream)
 791{
 792        struct hpi_message hm;
 793        struct hpi_response hr;
 794
 795        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 796                HPI_OSTREAM_HOSTBUFFER_FREE);
 797        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 798                return HPI_ERROR_INVALID_HANDLE;
 799        hpi_send_recv(&hm, &hr);
 800        return hr.error;
 801}
 802
 803u16 hpi_outstream_group_add(u32 h_outstream, u32 h_stream)
 804{
 805        struct hpi_message hm;
 806        struct hpi_response hr;
 807        u16 adapter;
 808        char c_obj_type;
 809
 810        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 811                HPI_OSTREAM_GROUP_ADD);
 812
 813        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 814                return HPI_ERROR_INVALID_HANDLE;
 815
 816        if (hpi_handle_indexes(h_stream, &adapter,
 817                        &hm.u.d.u.stream.stream_index))
 818                return HPI_ERROR_INVALID_HANDLE;
 819
 820        c_obj_type = hpi_handle_object(h_stream);
 821        switch (c_obj_type) {
 822        case HPI_OBJ_OSTREAM:
 823        case HPI_OBJ_ISTREAM:
 824                hm.u.d.u.stream.object_type = c_obj_type;
 825                break;
 826        default:
 827                return HPI_ERROR_INVALID_OBJ;
 828        }
 829        if (adapter != hm.adapter_index)
 830                return HPI_ERROR_NO_INTERADAPTER_GROUPS;
 831
 832        hpi_send_recv(&hm, &hr);
 833        return hr.error;
 834}
 835
 836u16 hpi_outstream_group_get_map(u32 h_outstream, u32 *poutstream_map,
 837        u32 *pinstream_map)
 838{
 839        struct hpi_message hm;
 840        struct hpi_response hr;
 841
 842        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 843                HPI_OSTREAM_GROUP_GETMAP);
 844        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 845                return HPI_ERROR_INVALID_HANDLE;
 846        hpi_send_recv(&hm, &hr);
 847
 848        if (poutstream_map)
 849                *poutstream_map = hr.u.d.u.group_info.outstream_group_map;
 850        if (pinstream_map)
 851                *pinstream_map = hr.u.d.u.group_info.instream_group_map;
 852
 853        return hr.error;
 854}
 855
 856u16 hpi_outstream_group_reset(u32 h_outstream)
 857{
 858        struct hpi_message hm;
 859        struct hpi_response hr;
 860
 861        hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
 862                HPI_OSTREAM_GROUP_RESET);
 863        if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
 864                return HPI_ERROR_INVALID_HANDLE;
 865        hpi_send_recv(&hm, &hr);
 866        return hr.error;
 867}
 868
 869u16 hpi_instream_open(u16 adapter_index, u16 instream_index, u32 *ph_instream)
 870{
 871        struct hpi_message hm;
 872        struct hpi_response hr;
 873
 874        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
 875                HPI_ISTREAM_OPEN);
 876        hm.adapter_index = adapter_index;
 877        hm.obj_index = instream_index;
 878
 879        hpi_send_recv(&hm, &hr);
 880
 881        if (hr.error == 0)
 882                *ph_instream =
 883                        hpi_indexes_to_handle(HPI_OBJ_ISTREAM, adapter_index,
 884                        instream_index);
 885        else
 886                *ph_instream = 0;
 887
 888        return hr.error;
 889}
 890
 891u16 hpi_instream_close(u32 h_instream)
 892{
 893        struct hpi_message hm;
 894        struct hpi_response hr;
 895
 896        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
 897                HPI_ISTREAM_HOSTBUFFER_FREE);
 898        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
 899                return HPI_ERROR_INVALID_HANDLE;
 900        hpi_send_recv(&hm, &hr);
 901
 902        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
 903                HPI_ISTREAM_GROUP_RESET);
 904        hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index);
 905        hpi_send_recv(&hm, &hr);
 906
 907        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
 908                HPI_ISTREAM_CLOSE);
 909        hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index);
 910        hpi_send_recv(&hm, &hr);
 911
 912        return hr.error;
 913}
 914
 915u16 hpi_instream_query_format(u32 h_instream,
 916        const struct hpi_format *p_format)
 917{
 918        struct hpi_message hm;
 919        struct hpi_response hr;
 920
 921        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
 922                HPI_ISTREAM_QUERY_FORMAT);
 923        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
 924                return HPI_ERROR_INVALID_HANDLE;
 925        hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
 926
 927        hpi_send_recv(&hm, &hr);
 928
 929        return hr.error;
 930}
 931
 932u16 hpi_instream_set_format(u32 h_instream, const struct hpi_format *p_format)
 933{
 934        struct hpi_message hm;
 935        struct hpi_response hr;
 936
 937        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
 938                HPI_ISTREAM_SET_FORMAT);
 939        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
 940                return HPI_ERROR_INVALID_HANDLE;
 941        hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
 942
 943        hpi_send_recv(&hm, &hr);
 944
 945        return hr.error;
 946}
 947
 948u16 hpi_instream_read_buf(u32 h_instream, u8 *pb_data, u32 bytes_to_read)
 949{
 950        struct hpi_message hm;
 951        struct hpi_response hr;
 952
 953        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
 954                HPI_ISTREAM_READ);
 955        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
 956                return HPI_ERROR_INVALID_HANDLE;
 957        hm.u.d.u.data.data_size = bytes_to_read;
 958        hm.u.d.u.data.pb_data = pb_data;
 959
 960        hpi_send_recv(&hm, &hr);
 961
 962        return hr.error;
 963}
 964
 965u16 hpi_instream_start(u32 h_instream)
 966{
 967        struct hpi_message hm;
 968        struct hpi_response hr;
 969
 970        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
 971                HPI_ISTREAM_START);
 972        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
 973                return HPI_ERROR_INVALID_HANDLE;
 974
 975        hpi_send_recv(&hm, &hr);
 976
 977        return hr.error;
 978}
 979
 980u16 hpi_instream_wait_start(u32 h_instream)
 981{
 982        struct hpi_message hm;
 983        struct hpi_response hr;
 984
 985        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
 986                HPI_ISTREAM_WAIT_START);
 987        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
 988                return HPI_ERROR_INVALID_HANDLE;
 989
 990        hpi_send_recv(&hm, &hr);
 991
 992        return hr.error;
 993}
 994
 995u16 hpi_instream_stop(u32 h_instream)
 996{
 997        struct hpi_message hm;
 998        struct hpi_response hr;
 999
1000        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1001                HPI_ISTREAM_STOP);
1002        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1003                return HPI_ERROR_INVALID_HANDLE;
1004
1005        hpi_send_recv(&hm, &hr);
1006
1007        return hr.error;
1008}
1009
1010u16 hpi_instream_reset(u32 h_instream)
1011{
1012        struct hpi_message hm;
1013        struct hpi_response hr;
1014
1015        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1016                HPI_ISTREAM_RESET);
1017        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1018                return HPI_ERROR_INVALID_HANDLE;
1019
1020        hpi_send_recv(&hm, &hr);
1021
1022        return hr.error;
1023}
1024
1025u16 hpi_instream_get_info_ex(u32 h_instream, u16 *pw_state, u32 *pbuffer_size,
1026        u32 *pdata_recorded, u32 *psamples_recorded,
1027        u32 *pauxiliary_data_recorded)
1028{
1029        struct hpi_message hm;
1030        struct hpi_response hr;
1031        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1032                HPI_ISTREAM_GET_INFO);
1033        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1034                return HPI_ERROR_INVALID_HANDLE;
1035
1036        hpi_send_recv(&hm, &hr);
1037
1038        if (pw_state)
1039                *pw_state = hr.u.d.u.stream_info.state;
1040        if (pbuffer_size)
1041                *pbuffer_size = hr.u.d.u.stream_info.buffer_size;
1042        if (pdata_recorded)
1043                *pdata_recorded = hr.u.d.u.stream_info.data_available;
1044        if (psamples_recorded)
1045                *psamples_recorded = hr.u.d.u.stream_info.samples_transferred;
1046        if (pauxiliary_data_recorded)
1047                *pauxiliary_data_recorded =
1048                        hr.u.d.u.stream_info.auxiliary_data_available;
1049        return hr.error;
1050}
1051
1052u16 hpi_instream_ancillary_reset(u32 h_instream, u16 bytes_per_frame,
1053        u16 mode, u16 alignment, u16 idle_bit)
1054{
1055        struct hpi_message hm;
1056        struct hpi_response hr;
1057        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1058                HPI_ISTREAM_ANC_RESET);
1059        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1060                return HPI_ERROR_INVALID_HANDLE;
1061        hm.u.d.u.data.format.attributes = bytes_per_frame;
1062        hm.u.d.u.data.format.format = (mode << 8) | (alignment & 0xff);
1063        hm.u.d.u.data.format.channels = idle_bit;
1064        hpi_send_recv(&hm, &hr);
1065        return hr.error;
1066}
1067
1068u16 hpi_instream_ancillary_get_info(u32 h_instream, u32 *pframe_space)
1069{
1070        struct hpi_message hm;
1071        struct hpi_response hr;
1072        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1073                HPI_ISTREAM_ANC_GET_INFO);
1074        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1075                return HPI_ERROR_INVALID_HANDLE;
1076        hpi_send_recv(&hm, &hr);
1077        if (pframe_space)
1078                *pframe_space =
1079                        (hr.u.d.u.stream_info.buffer_size -
1080                        hr.u.d.u.stream_info.data_available) /
1081                        sizeof(struct hpi_anc_frame);
1082        return hr.error;
1083}
1084
1085u16 hpi_instream_ancillary_write(u32 h_instream,
1086        const struct hpi_anc_frame *p_anc_frame_buffer,
1087        u32 anc_frame_buffer_size_in_bytes,
1088        u32 number_of_ancillary_frames_to_write)
1089{
1090        struct hpi_message hm;
1091        struct hpi_response hr;
1092
1093        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1094                HPI_ISTREAM_ANC_WRITE);
1095        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1096                return HPI_ERROR_INVALID_HANDLE;
1097        hm.u.d.u.data.pb_data = (u8 *)p_anc_frame_buffer;
1098        hm.u.d.u.data.data_size =
1099                number_of_ancillary_frames_to_write *
1100                sizeof(struct hpi_anc_frame);
1101        if (hm.u.d.u.data.data_size <= anc_frame_buffer_size_in_bytes)
1102                hpi_send_recv(&hm, &hr);
1103        else
1104                hr.error = HPI_ERROR_INVALID_DATASIZE;
1105        return hr.error;
1106}
1107
1108u16 hpi_instream_host_buffer_allocate(u32 h_instream, u32 size_in_bytes)
1109{
1110
1111        struct hpi_message hm;
1112        struct hpi_response hr;
1113
1114        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1115                HPI_ISTREAM_HOSTBUFFER_ALLOC);
1116        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1117                return HPI_ERROR_INVALID_HANDLE;
1118        hm.u.d.u.data.data_size = size_in_bytes;
1119        hpi_send_recv(&hm, &hr);
1120        return hr.error;
1121}
1122
1123u16 hpi_instream_host_buffer_get_info(u32 h_instream, u8 **pp_buffer,
1124        struct hpi_hostbuffer_status **pp_status)
1125{
1126        struct hpi_message hm;
1127        struct hpi_response hr;
1128
1129        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1130                HPI_ISTREAM_HOSTBUFFER_GET_INFO);
1131        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1132                return HPI_ERROR_INVALID_HANDLE;
1133        hpi_send_recv(&hm, &hr);
1134
1135        if (hr.error == 0) {
1136                if (pp_buffer)
1137                        *pp_buffer = hr.u.d.u.hostbuffer_info.p_buffer;
1138                if (pp_status)
1139                        *pp_status = hr.u.d.u.hostbuffer_info.p_status;
1140        }
1141        return hr.error;
1142}
1143
1144u16 hpi_instream_host_buffer_free(u32 h_instream)
1145{
1146
1147        struct hpi_message hm;
1148        struct hpi_response hr;
1149
1150        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1151                HPI_ISTREAM_HOSTBUFFER_FREE);
1152        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1153                return HPI_ERROR_INVALID_HANDLE;
1154        hpi_send_recv(&hm, &hr);
1155        return hr.error;
1156}
1157
1158u16 hpi_instream_group_add(u32 h_instream, u32 h_stream)
1159{
1160        struct hpi_message hm;
1161        struct hpi_response hr;
1162        u16 adapter;
1163        char c_obj_type;
1164
1165        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1166                HPI_ISTREAM_GROUP_ADD);
1167        hr.error = 0;
1168
1169        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1170                return HPI_ERROR_INVALID_HANDLE;
1171
1172        if (hpi_handle_indexes(h_stream, &adapter,
1173                        &hm.u.d.u.stream.stream_index))
1174                return HPI_ERROR_INVALID_HANDLE;
1175
1176        c_obj_type = hpi_handle_object(h_stream);
1177
1178        switch (c_obj_type) {
1179        case HPI_OBJ_OSTREAM:
1180        case HPI_OBJ_ISTREAM:
1181                hm.u.d.u.stream.object_type = c_obj_type;
1182                break;
1183        default:
1184                return HPI_ERROR_INVALID_OBJ;
1185        }
1186
1187        if (adapter != hm.adapter_index)
1188                return HPI_ERROR_NO_INTERADAPTER_GROUPS;
1189
1190        hpi_send_recv(&hm, &hr);
1191        return hr.error;
1192}
1193
1194u16 hpi_instream_group_get_map(u32 h_instream, u32 *poutstream_map,
1195        u32 *pinstream_map)
1196{
1197        struct hpi_message hm;
1198        struct hpi_response hr;
1199
1200        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1201                HPI_ISTREAM_HOSTBUFFER_FREE);
1202        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1203                return HPI_ERROR_INVALID_HANDLE;
1204        hpi_send_recv(&hm, &hr);
1205
1206        if (poutstream_map)
1207                *poutstream_map = hr.u.d.u.group_info.outstream_group_map;
1208        if (pinstream_map)
1209                *pinstream_map = hr.u.d.u.group_info.instream_group_map;
1210
1211        return hr.error;
1212}
1213
1214u16 hpi_instream_group_reset(u32 h_instream)
1215{
1216        struct hpi_message hm;
1217        struct hpi_response hr;
1218
1219        hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1220                HPI_ISTREAM_GROUP_RESET);
1221        if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1222                return HPI_ERROR_INVALID_HANDLE;
1223        hpi_send_recv(&hm, &hr);
1224        return hr.error;
1225}
1226
1227u16 hpi_mixer_open(u16 adapter_index, u32 *ph_mixer)
1228{
1229        struct hpi_message hm;
1230        struct hpi_response hr;
1231        hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_OPEN);
1232        hm.adapter_index = adapter_index;
1233
1234        hpi_send_recv(&hm, &hr);
1235
1236        if (hr.error == 0)
1237                *ph_mixer =
1238                        hpi_indexes_to_handle(HPI_OBJ_MIXER, adapter_index,
1239                        0);
1240        else
1241                *ph_mixer = 0;
1242        return hr.error;
1243}
1244
1245u16 hpi_mixer_close(u32 h_mixer)
1246{
1247        struct hpi_message hm;
1248        struct hpi_response hr;
1249
1250        hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_CLOSE);
1251        if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL))
1252                return HPI_ERROR_INVALID_HANDLE;
1253
1254        hpi_send_recv(&hm, &hr);
1255        return hr.error;
1256}
1257
1258u16 hpi_mixer_get_control(u32 h_mixer, u16 src_node_type,
1259        u16 src_node_type_index, u16 dst_node_type, u16 dst_node_type_index,
1260        u16 control_type, u32 *ph_control)
1261{
1262        struct hpi_message hm;
1263        struct hpi_response hr;
1264        hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER,
1265                HPI_MIXER_GET_CONTROL);
1266        if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL))
1267                return HPI_ERROR_INVALID_HANDLE;
1268        hm.u.m.node_type1 = src_node_type;
1269        hm.u.m.node_index1 = src_node_type_index;
1270        hm.u.m.node_type2 = dst_node_type;
1271        hm.u.m.node_index2 = dst_node_type_index;
1272        hm.u.m.control_type = control_type;
1273
1274        hpi_send_recv(&hm, &hr);
1275
1276        if (hr.error == 0)
1277                *ph_control =
1278                        hpi_indexes_to_handle(HPI_OBJ_CONTROL,
1279                        hm.adapter_index, hr.u.m.control_index);
1280        else
1281                *ph_control = 0;
1282        return hr.error;
1283}
1284
1285u16 hpi_mixer_get_control_by_index(u32 h_mixer, u16 control_index,
1286        u16 *pw_src_node_type, u16 *pw_src_node_index, u16 *pw_dst_node_type,
1287        u16 *pw_dst_node_index, u16 *pw_control_type, u32 *ph_control)
1288{
1289        struct hpi_message hm;
1290        struct hpi_response hr;
1291        hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER,
1292                HPI_MIXER_GET_CONTROL_BY_INDEX);
1293        if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL))
1294                return HPI_ERROR_INVALID_HANDLE;
1295        hm.u.m.control_index = control_index;
1296        hpi_send_recv(&hm, &hr);
1297
1298        if (pw_src_node_type) {
1299                *pw_src_node_type =
1300                        hr.u.m.src_node_type + HPI_SOURCENODE_NONE;
1301                *pw_src_node_index = hr.u.m.src_node_index;
1302                *pw_dst_node_type = hr.u.m.dst_node_type + HPI_DESTNODE_NONE;
1303                *pw_dst_node_index = hr.u.m.dst_node_index;
1304        }
1305        if (pw_control_type)
1306                *pw_control_type = hr.u.m.control_index;
1307
1308        if (ph_control) {
1309                if (hr.error == 0)
1310                        *ph_control =
1311                                hpi_indexes_to_handle(HPI_OBJ_CONTROL,
1312                                hm.adapter_index, control_index);
1313                else
1314                        *ph_control = 0;
1315        }
1316        return hr.error;
1317}
1318
1319u16 hpi_mixer_store(u32 h_mixer, enum HPI_MIXER_STORE_COMMAND command,
1320        u16 index)
1321{
1322        struct hpi_message hm;
1323        struct hpi_response hr;
1324        hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_STORE);
1325        if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL))
1326                return HPI_ERROR_INVALID_HANDLE;
1327        hm.u.mx.store.command = command;
1328        hm.u.mx.store.index = index;
1329        hpi_send_recv(&hm, &hr);
1330        return hr.error;
1331}
1332
1333static
1334u16 hpi_control_param_set(const u32 h_control, const u16 attrib,
1335        const u32 param1, const u32 param2)
1336{
1337        struct hpi_message hm;
1338        struct hpi_response hr;
1339
1340        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1341                HPI_CONTROL_SET_STATE);
1342        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1343                return HPI_ERROR_INVALID_HANDLE;
1344        hm.u.c.attribute = attrib;
1345        hm.u.c.param1 = param1;
1346        hm.u.c.param2 = param2;
1347        hpi_send_recv(&hm, &hr);
1348        return hr.error;
1349}
1350
1351static u16 hpi_control_log_set2(u32 h_control, u16 attrib, short sv0,
1352        short sv1)
1353{
1354        struct hpi_message hm;
1355        struct hpi_response hr;
1356
1357        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1358                HPI_CONTROL_SET_STATE);
1359        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1360                return HPI_ERROR_INVALID_HANDLE;
1361        hm.u.c.attribute = attrib;
1362        hm.u.c.an_log_value[0] = sv0;
1363        hm.u.c.an_log_value[1] = sv1;
1364        hpi_send_recv(&hm, &hr);
1365        return hr.error;
1366}
1367
1368static
1369u16 hpi_control_param_get(const u32 h_control, const u16 attrib, u32 param1,
1370        u32 param2, u32 *pparam1, u32 *pparam2)
1371{
1372        struct hpi_message hm;
1373        struct hpi_response hr;
1374
1375        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1376                HPI_CONTROL_GET_STATE);
1377        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1378                return HPI_ERROR_INVALID_HANDLE;
1379        hm.u.c.attribute = attrib;
1380        hm.u.c.param1 = param1;
1381        hm.u.c.param2 = param2;
1382        hpi_send_recv(&hm, &hr);
1383
1384        *pparam1 = hr.u.c.param1;
1385        if (pparam2)
1386                *pparam2 = hr.u.c.param2;
1387
1388        return hr.error;
1389}
1390
1391#define hpi_control_param1_get(h, a, p1) \
1392                hpi_control_param_get(h, a, 0, 0, p1, NULL)
1393#define hpi_control_param2_get(h, a, p1, p2) \
1394                hpi_control_param_get(h, a, 0, 0, p1, p2)
1395
1396static u16 hpi_control_log_get2(u32 h_control, u16 attrib, short *sv0,
1397        short *sv1)
1398{
1399        struct hpi_message hm;
1400        struct hpi_response hr;
1401        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1402                HPI_CONTROL_GET_STATE);
1403        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1404                return HPI_ERROR_INVALID_HANDLE;
1405        hm.u.c.attribute = attrib;
1406
1407        hpi_send_recv(&hm, &hr);
1408        *sv0 = hr.u.c.an_log_value[0];
1409        if (sv1)
1410                *sv1 = hr.u.c.an_log_value[1];
1411        return hr.error;
1412}
1413
1414static
1415u16 hpi_control_query(const u32 h_control, const u16 attrib, const u32 index,
1416        const u32 param, u32 *psetting)
1417{
1418        struct hpi_message hm;
1419        struct hpi_response hr;
1420
1421        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1422                HPI_CONTROL_GET_INFO);
1423        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1424                return HPI_ERROR_INVALID_HANDLE;
1425
1426        hm.u.c.attribute = attrib;
1427        hm.u.c.param1 = index;
1428        hm.u.c.param2 = param;
1429
1430        hpi_send_recv(&hm, &hr);
1431        *psetting = hr.u.c.param1;
1432
1433        return hr.error;
1434}
1435
1436static u16 hpi_control_get_string(const u32 h_control, const u16 attribute,
1437        char *psz_string, const u32 string_length)
1438{
1439        unsigned int sub_string_index = 0, j = 0;
1440        char c = 0;
1441        unsigned int n = 0;
1442        u16 err = 0;
1443
1444        if ((string_length < 1) || (string_length > 256))
1445                return HPI_ERROR_INVALID_CONTROL_VALUE;
1446        for (sub_string_index = 0; sub_string_index < string_length;
1447                sub_string_index += 8) {
1448                struct hpi_message hm;
1449                struct hpi_response hr;
1450
1451                hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1452                        HPI_CONTROL_GET_STATE);
1453                if (hpi_handle_indexes(h_control, &hm.adapter_index,
1454                                &hm.obj_index))
1455                        return HPI_ERROR_INVALID_HANDLE;
1456                hm.u.c.attribute = attribute;
1457                hm.u.c.param1 = sub_string_index;
1458                hm.u.c.param2 = 0;
1459                hpi_send_recv(&hm, &hr);
1460
1461                if (sub_string_index == 0
1462                        && (hr.u.cu.chars8.remaining_chars + 8) >
1463                        string_length)
1464                        return HPI_ERROR_INVALID_CONTROL_VALUE;
1465
1466                if (hr.error) {
1467                        err = hr.error;
1468                        break;
1469                }
1470                for (j = 0; j < 8; j++) {
1471                        c = hr.u.cu.chars8.sz_data[j];
1472                        psz_string[sub_string_index + j] = c;
1473                        n++;
1474                        if (n >= string_length) {
1475                                psz_string[string_length - 1] = 0;
1476                                err = HPI_ERROR_INVALID_CONTROL_VALUE;
1477                                break;
1478                        }
1479                        if (c == 0)
1480                                break;
1481                }
1482
1483                if ((hr.u.cu.chars8.remaining_chars == 0)
1484                        && ((sub_string_index + j) < string_length)
1485                        && (c != 0)) {
1486                        c = 0;
1487                        psz_string[sub_string_index + j] = c;
1488                }
1489                if (c == 0)
1490                        break;
1491        }
1492        return err;
1493}
1494
1495u16 hpi_aesebu_receiver_query_format(const u32 h_aes_rx, const u32 index,
1496        u16 *pw_format)
1497{
1498        u32 qr;
1499        u16 err;
1500
1501        err = hpi_control_query(h_aes_rx, HPI_AESEBURX_FORMAT, index, 0, &qr);
1502        *pw_format = (u16)qr;
1503        return err;
1504}
1505
1506u16 hpi_aesebu_receiver_set_format(u32 h_control, u16 format)
1507{
1508        return hpi_control_param_set(h_control, HPI_AESEBURX_FORMAT, format,
1509                0);
1510}
1511
1512u16 hpi_aesebu_receiver_get_format(u32 h_control, u16 *pw_format)
1513{
1514        u16 err;
1515        u32 param;
1516
1517        err = hpi_control_param1_get(h_control, HPI_AESEBURX_FORMAT, &param);
1518        if (!err && pw_format)
1519                *pw_format = (u16)param;
1520
1521        return err;
1522}
1523
1524u16 hpi_aesebu_receiver_get_sample_rate(u32 h_control, u32 *psample_rate)
1525{
1526        return hpi_control_param1_get(h_control, HPI_AESEBURX_SAMPLERATE,
1527                psample_rate);
1528}
1529
1530u16 hpi_aesebu_receiver_get_user_data(u32 h_control, u16 index, u16 *pw_data)
1531{
1532        struct hpi_message hm;
1533        struct hpi_response hr;
1534        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1535                HPI_CONTROL_GET_STATE);
1536        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1537                return HPI_ERROR_INVALID_HANDLE;
1538        hm.u.c.attribute = HPI_AESEBURX_USERDATA;
1539        hm.u.c.param1 = index;
1540
1541        hpi_send_recv(&hm, &hr);
1542
1543        if (pw_data)
1544                *pw_data = (u16)hr.u.c.param2;
1545        return hr.error;
1546}
1547
1548u16 hpi_aesebu_receiver_get_channel_status(u32 h_control, u16 index,
1549        u16 *pw_data)
1550{
1551        struct hpi_message hm;
1552        struct hpi_response hr;
1553        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1554                HPI_CONTROL_GET_STATE);
1555        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1556                return HPI_ERROR_INVALID_HANDLE;
1557        hm.u.c.attribute = HPI_AESEBURX_CHANNELSTATUS;
1558        hm.u.c.param1 = index;
1559
1560        hpi_send_recv(&hm, &hr);
1561
1562        if (pw_data)
1563                *pw_data = (u16)hr.u.c.param2;
1564        return hr.error;
1565}
1566
1567u16 hpi_aesebu_receiver_get_error_status(u32 h_control, u16 *pw_error_data)
1568{
1569        u32 error_data = 0;
1570        u16 err = 0;
1571
1572        err = hpi_control_param1_get(h_control, HPI_AESEBURX_ERRORSTATUS,
1573                &error_data);
1574        if (pw_error_data)
1575                *pw_error_data = (u16)error_data;
1576        return err;
1577}
1578
1579u16 hpi_aesebu_transmitter_set_sample_rate(u32 h_control, u32 sample_rate)
1580{
1581        return hpi_control_param_set(h_control, HPI_AESEBUTX_SAMPLERATE,
1582                sample_rate, 0);
1583}
1584
1585u16 hpi_aesebu_transmitter_set_user_data(u32 h_control, u16 index, u16 data)
1586{
1587        return hpi_control_param_set(h_control, HPI_AESEBUTX_USERDATA, index,
1588                data);
1589}
1590
1591u16 hpi_aesebu_transmitter_set_channel_status(u32 h_control, u16 index,
1592        u16 data)
1593{
1594        return hpi_control_param_set(h_control, HPI_AESEBUTX_CHANNELSTATUS,
1595                index, data);
1596}
1597
1598u16 hpi_aesebu_transmitter_get_channel_status(u32 h_control, u16 index,
1599        u16 *pw_data)
1600{
1601        return HPI_ERROR_INVALID_OPERATION;
1602}
1603
1604u16 hpi_aesebu_transmitter_query_format(const u32 h_aes_tx, const u32 index,
1605        u16 *pw_format)
1606{
1607        u32 qr;
1608        u16 err;
1609
1610        err = hpi_control_query(h_aes_tx, HPI_AESEBUTX_FORMAT, index, 0, &qr);
1611        *pw_format = (u16)qr;
1612        return err;
1613}
1614
1615u16 hpi_aesebu_transmitter_set_format(u32 h_control, u16 output_format)
1616{
1617        return hpi_control_param_set(h_control, HPI_AESEBUTX_FORMAT,
1618                output_format, 0);
1619}
1620
1621u16 hpi_aesebu_transmitter_get_format(u32 h_control, u16 *pw_output_format)
1622{
1623        u16 err;
1624        u32 param;
1625
1626        err = hpi_control_param1_get(h_control, HPI_AESEBUTX_FORMAT, &param);
1627        if (!err && pw_output_format)
1628                *pw_output_format = (u16)param;
1629
1630        return err;
1631}
1632
1633u16 hpi_bitstream_set_clock_edge(u32 h_control, u16 edge_type)
1634{
1635        return hpi_control_param_set(h_control, HPI_BITSTREAM_CLOCK_EDGE,
1636                edge_type, 0);
1637}
1638
1639u16 hpi_bitstream_set_data_polarity(u32 h_control, u16 polarity)
1640{
1641        return hpi_control_param_set(h_control, HPI_BITSTREAM_DATA_POLARITY,
1642                polarity, 0);
1643}
1644
1645u16 hpi_bitstream_get_activity(u32 h_control, u16 *pw_clk_activity,
1646        u16 *pw_data_activity)
1647{
1648        struct hpi_message hm;
1649        struct hpi_response hr;
1650        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1651                HPI_CONTROL_GET_STATE);
1652        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1653                return HPI_ERROR_INVALID_HANDLE;
1654        hm.u.c.attribute = HPI_BITSTREAM_ACTIVITY;
1655        hpi_send_recv(&hm, &hr);
1656        if (pw_clk_activity)
1657                *pw_clk_activity = (u16)hr.u.c.param1;
1658        if (pw_data_activity)
1659                *pw_data_activity = (u16)hr.u.c.param2;
1660        return hr.error;
1661}
1662
1663u16 hpi_channel_mode_query_mode(const u32 h_mode, const u32 index,
1664        u16 *pw_mode)
1665{
1666        u32 qr;
1667        u16 err;
1668
1669        err = hpi_control_query(h_mode, HPI_CHANNEL_MODE_MODE, index, 0, &qr);
1670        *pw_mode = (u16)qr;
1671        return err;
1672}
1673
1674u16 hpi_channel_mode_set(u32 h_control, u16 mode)
1675{
1676        return hpi_control_param_set(h_control, HPI_CHANNEL_MODE_MODE, mode,
1677                0);
1678}
1679
1680u16 hpi_channel_mode_get(u32 h_control, u16 *mode)
1681{
1682        u32 mode32 = 0;
1683        u16 err = hpi_control_param1_get(h_control,
1684                HPI_CHANNEL_MODE_MODE, &mode32);
1685        if (mode)
1686                *mode = (u16)mode32;
1687        return err;
1688}
1689
1690u16 hpi_cobranet_hmi_write(u32 h_control, u32 hmi_address, u32 byte_count,
1691        u8 *pb_data)
1692{
1693        struct hpi_message hm;
1694        struct hpi_response hr;
1695
1696        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROLEX,
1697                HPI_CONTROL_SET_STATE);
1698        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1699                return HPI_ERROR_INVALID_HANDLE;
1700
1701        hm.u.cx.u.cobranet_data.byte_count = byte_count;
1702        hm.u.cx.u.cobranet_data.hmi_address = hmi_address;
1703
1704        if (byte_count <= 8) {
1705                memcpy(hm.u.cx.u.cobranet_data.data, pb_data, byte_count);
1706                hm.u.cx.attribute = HPI_COBRANET_SET;
1707        } else {
1708                hm.u.cx.u.cobranet_bigdata.pb_data = pb_data;
1709                hm.u.cx.attribute = HPI_COBRANET_SET_DATA;
1710        }
1711
1712        hpi_send_recv(&hm, &hr);
1713
1714        return hr.error;
1715}
1716
1717u16 hpi_cobranet_hmi_read(u32 h_control, u32 hmi_address, u32 max_byte_count,
1718        u32 *pbyte_count, u8 *pb_data)
1719{
1720        struct hpi_message hm;
1721        struct hpi_response hr;
1722
1723        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROLEX,
1724                HPI_CONTROL_GET_STATE);
1725        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1726                return HPI_ERROR_INVALID_HANDLE;
1727
1728        hm.u.cx.u.cobranet_data.byte_count = max_byte_count;
1729        hm.u.cx.u.cobranet_data.hmi_address = hmi_address;
1730
1731        if (max_byte_count <= 8) {
1732                hm.u.cx.attribute = HPI_COBRANET_GET;
1733        } else {
1734                hm.u.cx.u.cobranet_bigdata.pb_data = pb_data;
1735                hm.u.cx.attribute = HPI_COBRANET_GET_DATA;
1736        }
1737
1738        hpi_send_recv(&hm, &hr);
1739        if (!hr.error && pb_data) {
1740
1741                *pbyte_count = hr.u.cx.u.cobranet_data.byte_count;
1742
1743                if (*pbyte_count < max_byte_count)
1744                        max_byte_count = *pbyte_count;
1745
1746                if (hm.u.cx.attribute == HPI_COBRANET_GET) {
1747                        memcpy(pb_data, hr.u.cx.u.cobranet_data.data,
1748                                max_byte_count);
1749                } else {
1750
1751                }
1752
1753        }
1754        return hr.error;
1755}
1756
1757u16 hpi_cobranet_hmi_get_status(u32 h_control, u32 *pstatus,
1758        u32 *preadable_size, u32 *pwriteable_size)
1759{
1760        struct hpi_message hm;
1761        struct hpi_response hr;
1762
1763        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROLEX,
1764                HPI_CONTROL_GET_STATE);
1765        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1766                return HPI_ERROR_INVALID_HANDLE;
1767
1768        hm.u.cx.attribute = HPI_COBRANET_GET_STATUS;
1769
1770        hpi_send_recv(&hm, &hr);
1771        if (!hr.error) {
1772                if (pstatus)
1773                        *pstatus = hr.u.cx.u.cobranet_status.status;
1774                if (preadable_size)
1775                        *preadable_size =
1776                                hr.u.cx.u.cobranet_status.readable_size;
1777                if (pwriteable_size)
1778                        *pwriteable_size =
1779                                hr.u.cx.u.cobranet_status.writeable_size;
1780        }
1781        return hr.error;
1782}
1783
1784u16 hpi_cobranet_get_ip_address(u32 h_control, u32 *pdw_ip_address)
1785{
1786        u32 byte_count;
1787        u32 iP;
1788        u16 err;
1789
1790        err = hpi_cobranet_hmi_read(h_control,
1791                HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, &byte_count,
1792                (u8 *)&iP);
1793
1794        *pdw_ip_address =
1795                ((iP & 0xff000000) >> 8) | ((iP & 0x00ff0000) << 8) | ((iP &
1796                        0x0000ff00) >> 8) | ((iP & 0x000000ff) << 8);
1797
1798        if (err)
1799                *pdw_ip_address = 0;
1800
1801        return err;
1802
1803}
1804
1805u16 hpi_cobranet_set_ip_address(u32 h_control, u32 dw_ip_address)
1806{
1807        u32 iP;
1808        u16 err;
1809
1810        iP = ((dw_ip_address & 0xff000000) >> 8) | ((dw_ip_address &
1811                        0x00ff0000) << 8) | ((dw_ip_address & 0x0000ff00) >>
1812                8) | ((dw_ip_address & 0x000000ff) << 8);
1813
1814        err = hpi_cobranet_hmi_write(h_control,
1815                HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, (u8 *)&iP);
1816
1817        return err;
1818
1819}
1820
1821u16 hpi_cobranet_get_static_ip_address(u32 h_control, u32 *pdw_ip_address)
1822{
1823        u32 byte_count;
1824        u32 iP;
1825        u16 err;
1826        err = hpi_cobranet_hmi_read(h_control,
1827                HPI_COBRANET_HMI_cobra_ip_mon_staticIP, 4, &byte_count,
1828                (u8 *)&iP);
1829
1830        *pdw_ip_address =
1831                ((iP & 0xff000000) >> 8) | ((iP & 0x00ff0000) << 8) | ((iP &
1832                        0x0000ff00) >> 8) | ((iP & 0x000000ff) << 8);
1833
1834        if (err)
1835                *pdw_ip_address = 0;
1836
1837        return err;
1838
1839}
1840
1841u16 hpi_cobranet_set_static_ip_address(u32 h_control, u32 dw_ip_address)
1842{
1843        u32 iP;
1844        u16 err;
1845
1846        iP = ((dw_ip_address & 0xff000000) >> 8) | ((dw_ip_address &
1847                        0x00ff0000) << 8) | ((dw_ip_address & 0x0000ff00) >>
1848                8) | ((dw_ip_address & 0x000000ff) << 8);
1849
1850        err = hpi_cobranet_hmi_write(h_control,
1851                HPI_COBRANET_HMI_cobra_ip_mon_staticIP, 4, (u8 *)&iP);
1852
1853        return err;
1854
1855}
1856
1857u16 hpi_cobranet_get_macaddress(u32 h_control, u32 *p_mac_msbs,
1858        u32 *p_mac_lsbs)
1859{
1860        u32 byte_count;
1861        u16 err;
1862        u32 mac;
1863
1864        err = hpi_cobranet_hmi_read(h_control,
1865                HPI_COBRANET_HMI_cobra_if_phy_address, 4, &byte_count,
1866                (u8 *)&mac);
1867
1868        if (!err) {
1869                *p_mac_msbs =
1870                        ((mac & 0xff000000) >> 8) | ((mac & 0x00ff0000) << 8)
1871                        | ((mac & 0x0000ff00) >> 8) | ((mac & 0x000000ff) <<
1872                        8);
1873
1874                err = hpi_cobranet_hmi_read(h_control,
1875                        HPI_COBRANET_HMI_cobra_if_phy_address + 1, 4,
1876                        &byte_count, (u8 *)&mac);
1877        }
1878
1879        if (!err) {
1880                *p_mac_lsbs =
1881                        ((mac & 0xff000000) >> 8) | ((mac & 0x00ff0000) << 8)
1882                        | ((mac & 0x0000ff00) >> 8) | ((mac & 0x000000ff) <<
1883                        8);
1884        } else {
1885                *p_mac_msbs = 0;
1886                *p_mac_lsbs = 0;
1887        }
1888
1889        return err;
1890}
1891
1892u16 hpi_compander_set_enable(u32 h_control, u32 enable)
1893{
1894        return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
1895                0);
1896}
1897
1898u16 hpi_compander_get_enable(u32 h_control, u32 *enable)
1899{
1900        return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
1901}
1902
1903u16 hpi_compander_set_makeup_gain(u32 h_control, short makeup_gain0_01dB)
1904{
1905        return hpi_control_log_set2(h_control, HPI_COMPANDER_MAKEUPGAIN,
1906                makeup_gain0_01dB, 0);
1907}
1908
1909u16 hpi_compander_get_makeup_gain(u32 h_control, short *makeup_gain0_01dB)
1910{
1911        return hpi_control_log_get2(h_control, HPI_COMPANDER_MAKEUPGAIN,
1912                makeup_gain0_01dB, NULL);
1913}
1914
1915u16 hpi_compander_set_attack_time_constant(u32 h_control, unsigned int index,
1916        u32 attack)
1917{
1918        return hpi_control_param_set(h_control, HPI_COMPANDER_ATTACK, attack,
1919                index);
1920}
1921
1922u16 hpi_compander_get_attack_time_constant(u32 h_control, unsigned int index,
1923        u32 *attack)
1924{
1925        return hpi_control_param_get(h_control, HPI_COMPANDER_ATTACK, 0,
1926                index, attack, NULL);
1927}
1928
1929u16 hpi_compander_set_decay_time_constant(u32 h_control, unsigned int index,
1930        u32 decay)
1931{
1932        return hpi_control_param_set(h_control, HPI_COMPANDER_DECAY, decay,
1933                index);
1934}
1935
1936u16 hpi_compander_get_decay_time_constant(u32 h_control, unsigned int index,
1937        u32 *decay)
1938{
1939        return hpi_control_param_get(h_control, HPI_COMPANDER_DECAY, 0, index,
1940                decay, NULL);
1941
1942}
1943
1944u16 hpi_compander_set_threshold(u32 h_control, unsigned int index,
1945        short threshold0_01dB)
1946{
1947        struct hpi_message hm;
1948        struct hpi_response hr;
1949
1950        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1951                HPI_CONTROL_SET_STATE);
1952        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1953                return HPI_ERROR_INVALID_HANDLE;
1954        hm.u.c.attribute = HPI_COMPANDER_THRESHOLD;
1955        hm.u.c.param2 = index;
1956        hm.u.c.an_log_value[0] = threshold0_01dB;
1957
1958        hpi_send_recv(&hm, &hr);
1959
1960        return hr.error;
1961}
1962
1963u16 hpi_compander_get_threshold(u32 h_control, unsigned int index,
1964        short *threshold0_01dB)
1965{
1966        struct hpi_message hm;
1967        struct hpi_response hr;
1968
1969        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1970                HPI_CONTROL_GET_STATE);
1971        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1972                return HPI_ERROR_INVALID_HANDLE;
1973        hm.u.c.attribute = HPI_COMPANDER_THRESHOLD;
1974        hm.u.c.param2 = index;
1975
1976        hpi_send_recv(&hm, &hr);
1977        *threshold0_01dB = hr.u.c.an_log_value[0];
1978
1979        return hr.error;
1980}
1981
1982u16 hpi_compander_set_ratio(u32 h_control, u32 index, u32 ratio100)
1983{
1984        return hpi_control_param_set(h_control, HPI_COMPANDER_RATIO, ratio100,
1985                index);
1986}
1987
1988u16 hpi_compander_get_ratio(u32 h_control, u32 index, u32 *ratio100)
1989{
1990        return hpi_control_param_get(h_control, HPI_COMPANDER_RATIO, 0, index,
1991                ratio100, NULL);
1992}
1993
1994u16 hpi_level_query_range(u32 h_control, short *min_gain_01dB,
1995        short *max_gain_01dB, short *step_gain_01dB)
1996{
1997        struct hpi_message hm;
1998        struct hpi_response hr;
1999
2000        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2001                HPI_CONTROL_GET_STATE);
2002        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2003                return HPI_ERROR_INVALID_HANDLE;
2004        hm.u.c.attribute = HPI_LEVEL_RANGE;
2005
2006        hpi_send_recv(&hm, &hr);
2007        if (hr.error) {
2008                hr.u.c.an_log_value[0] = 0;
2009                hr.u.c.an_log_value[1] = 0;
2010                hr.u.c.param1 = 0;
2011        }
2012        if (min_gain_01dB)
2013                *min_gain_01dB = hr.u.c.an_log_value[0];
2014        if (max_gain_01dB)
2015                *max_gain_01dB = hr.u.c.an_log_value[1];
2016        if (step_gain_01dB)
2017                *step_gain_01dB = (short)hr.u.c.param1;
2018        return hr.error;
2019}
2020
2021u16 hpi_level_set_gain(u32 h_control, short an_gain0_01dB[HPI_MAX_CHANNELS]
2022        )
2023{
2024        return hpi_control_log_set2(h_control, HPI_LEVEL_GAIN,
2025                an_gain0_01dB[0], an_gain0_01dB[1]);
2026}
2027
2028u16 hpi_level_get_gain(u32 h_control, short an_gain0_01dB[HPI_MAX_CHANNELS]
2029        )
2030{
2031        return hpi_control_log_get2(h_control, HPI_LEVEL_GAIN,
2032                &an_gain0_01dB[0], &an_gain0_01dB[1]);
2033}
2034
2035u16 hpi_meter_query_channels(const u32 h_meter, u32 *p_channels)
2036{
2037        return hpi_control_query(h_meter, HPI_METER_NUM_CHANNELS, 0, 0,
2038                p_channels);
2039}
2040
2041u16 hpi_meter_get_peak(u32 h_control, short an_peakdB[HPI_MAX_CHANNELS]
2042        )
2043{
2044        short i = 0;
2045
2046        struct hpi_message hm;
2047        struct hpi_response hr;
2048
2049        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2050                HPI_CONTROL_GET_STATE);
2051        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2052                return HPI_ERROR_INVALID_HANDLE;
2053        hm.obj_index = hm.obj_index;
2054        hm.u.c.attribute = HPI_METER_PEAK;
2055
2056        hpi_send_recv(&hm, &hr);
2057
2058        if (!hr.error)
2059                memcpy(an_peakdB, hr.u.c.an_log_value,
2060                        sizeof(short) * HPI_MAX_CHANNELS);
2061        else
2062                for (i = 0; i < HPI_MAX_CHANNELS; i++)
2063                        an_peakdB[i] = HPI_METER_MINIMUM;
2064        return hr.error;
2065}
2066
2067u16 hpi_meter_get_rms(u32 h_control, short an_rmsdB[HPI_MAX_CHANNELS]
2068        )
2069{
2070        short i = 0;
2071
2072        struct hpi_message hm;
2073        struct hpi_response hr;
2074
2075        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2076                HPI_CONTROL_GET_STATE);
2077        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2078                return HPI_ERROR_INVALID_HANDLE;
2079        hm.u.c.attribute = HPI_METER_RMS;
2080
2081        hpi_send_recv(&hm, &hr);
2082
2083        if (!hr.error)
2084                memcpy(an_rmsdB, hr.u.c.an_log_value,
2085                        sizeof(short) * HPI_MAX_CHANNELS);
2086        else
2087                for (i = 0; i < HPI_MAX_CHANNELS; i++)
2088                        an_rmsdB[i] = HPI_METER_MINIMUM;
2089
2090        return hr.error;
2091}
2092
2093u16 hpi_meter_set_rms_ballistics(u32 h_control, u16 attack, u16 decay)
2094{
2095        return hpi_control_param_set(h_control, HPI_METER_RMS_BALLISTICS,
2096                attack, decay);
2097}
2098
2099u16 hpi_meter_get_rms_ballistics(u32 h_control, u16 *pn_attack, u16 *pn_decay)
2100{
2101        u32 attack;
2102        u32 decay;
2103        u16 error;
2104
2105        error = hpi_control_param2_get(h_control, HPI_METER_RMS_BALLISTICS,
2106                &attack, &decay);
2107
2108        if (pn_attack)
2109                *pn_attack = (unsigned short)attack;
2110        if (pn_decay)
2111                *pn_decay = (unsigned short)decay;
2112
2113        return error;
2114}
2115
2116u16 hpi_meter_set_peak_ballistics(u32 h_control, u16 attack, u16 decay)
2117{
2118        return hpi_control_param_set(h_control, HPI_METER_PEAK_BALLISTICS,
2119                attack, decay);
2120}
2121
2122u16 hpi_meter_get_peak_ballistics(u32 h_control, u16 *pn_attack,
2123        u16 *pn_decay)
2124{
2125        u32 attack;
2126        u32 decay;
2127        u16 error;
2128
2129        error = hpi_control_param2_get(h_control, HPI_METER_PEAK_BALLISTICS,
2130                &attack, &decay);
2131
2132        if (pn_attack)
2133                *pn_attack = (short)attack;
2134        if (pn_decay)
2135                *pn_decay = (short)decay;
2136
2137        return error;
2138}
2139
2140u16 hpi_microphone_set_phantom_power(u32 h_control, u16 on_off)
2141{
2142        return hpi_control_param_set(h_control, HPI_MICROPHONE_PHANTOM_POWER,
2143                (u32)on_off, 0);
2144}
2145
2146u16 hpi_microphone_get_phantom_power(u32 h_control, u16 *pw_on_off)
2147{
2148        u16 error = 0;
2149        u32 on_off = 0;
2150        error = hpi_control_param1_get(h_control,
2151                HPI_MICROPHONE_PHANTOM_POWER, &on_off);
2152        if (pw_on_off)
2153                *pw_on_off = (u16)on_off;
2154        return error;
2155}
2156
2157u16 hpi_multiplexer_set_source(u32 h_control, u16 source_node_type,
2158        u16 source_node_index)
2159{
2160        return hpi_control_param_set(h_control, HPI_MULTIPLEXER_SOURCE,
2161                source_node_type, source_node_index);
2162}
2163
2164u16 hpi_multiplexer_get_source(u32 h_control, u16 *source_node_type,
2165        u16 *source_node_index)
2166{
2167        u32 node, index;
2168        u16 err = hpi_control_param2_get(h_control,
2169                HPI_MULTIPLEXER_SOURCE, &node,
2170                &index);
2171        if (source_node_type)
2172                *source_node_type = (u16)node;
2173        if (source_node_index)
2174                *source_node_index = (u16)index;
2175        return err;
2176}
2177
2178u16 hpi_multiplexer_query_source(u32 h_control, u16 index,
2179        u16 *source_node_type, u16 *source_node_index)
2180{
2181        struct hpi_message hm;
2182        struct hpi_response hr;
2183        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2184                HPI_CONTROL_GET_STATE);
2185        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2186                return HPI_ERROR_INVALID_HANDLE;
2187        hm.u.c.attribute = HPI_MULTIPLEXER_QUERYSOURCE;
2188        hm.u.c.param1 = index;
2189
2190        hpi_send_recv(&hm, &hr);
2191
2192        if (source_node_type)
2193                *source_node_type = (u16)hr.u.c.param1;
2194        if (source_node_index)
2195                *source_node_index = (u16)hr.u.c.param2;
2196        return hr.error;
2197}
2198
2199u16 hpi_parametric_eq_get_info(u32 h_control, u16 *pw_number_of_bands,
2200        u16 *pw_on_off)
2201{
2202        u32 oB = 0;
2203        u32 oO = 0;
2204        u16 error = 0;
2205
2206        error = hpi_control_param2_get(h_control, HPI_EQUALIZER_NUM_FILTERS,
2207                &oO, &oB);
2208        if (pw_number_of_bands)
2209                *pw_number_of_bands = (u16)oB;
2210        if (pw_on_off)
2211                *pw_on_off = (u16)oO;
2212        return error;
2213}
2214
2215u16 hpi_parametric_eq_set_state(u32 h_control, u16 on_off)
2216{
2217        return hpi_control_param_set(h_control, HPI_EQUALIZER_NUM_FILTERS,
2218                on_off, 0);
2219}
2220
2221u16 hpi_parametric_eq_get_band(u32 h_control, u16 index, u16 *pn_type,
2222        u32 *pfrequency_hz, short *pnQ100, short *pn_gain0_01dB)
2223{
2224        struct hpi_message hm;
2225        struct hpi_response hr;
2226
2227        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2228                HPI_CONTROL_GET_STATE);
2229        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2230                return HPI_ERROR_INVALID_HANDLE;
2231        hm.u.c.attribute = HPI_EQUALIZER_FILTER;
2232        hm.u.c.param2 = index;
2233
2234        hpi_send_recv(&hm, &hr);
2235
2236        if (pfrequency_hz)
2237                *pfrequency_hz = hr.u.c.param1;
2238        if (pn_type)
2239                *pn_type = (u16)(hr.u.c.param2 >> 16);
2240        if (pnQ100)
2241                *pnQ100 = hr.u.c.an_log_value[1];
2242        if (pn_gain0_01dB)
2243                *pn_gain0_01dB = hr.u.c.an_log_value[0];
2244
2245        return hr.error;
2246}
2247
2248u16 hpi_parametric_eq_set_band(u32 h_control, u16 index, u16 type,
2249        u32 frequency_hz, short q100, short gain0_01dB)
2250{
2251        struct hpi_message hm;
2252        struct hpi_response hr;
2253
2254        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2255                HPI_CONTROL_SET_STATE);
2256        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2257                return HPI_ERROR_INVALID_HANDLE;
2258
2259        hm.u.c.param1 = frequency_hz;
2260        hm.u.c.param2 = (index & 0xFFFFL) + ((u32)type << 16);
2261        hm.u.c.an_log_value[0] = gain0_01dB;
2262        hm.u.c.an_log_value[1] = q100;
2263        hm.u.c.attribute = HPI_EQUALIZER_FILTER;
2264
2265        hpi_send_recv(&hm, &hr);
2266
2267        return hr.error;
2268}
2269
2270u16 hpi_parametric_eq_get_coeffs(u32 h_control, u16 index, short coeffs[5]
2271        )
2272{
2273        struct hpi_message hm;
2274        struct hpi_response hr;
2275
2276        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2277                HPI_CONTROL_GET_STATE);
2278        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2279                return HPI_ERROR_INVALID_HANDLE;
2280        hm.u.c.attribute = HPI_EQUALIZER_COEFFICIENTS;
2281        hm.u.c.param2 = index;
2282
2283        hpi_send_recv(&hm, &hr);
2284
2285        coeffs[0] = (short)hr.u.c.an_log_value[0];
2286        coeffs[1] = (short)hr.u.c.an_log_value[1];
2287        coeffs[2] = (short)hr.u.c.param1;
2288        coeffs[3] = (short)(hr.u.c.param1 >> 16);
2289        coeffs[4] = (short)hr.u.c.param2;
2290
2291        return hr.error;
2292}
2293
2294u16 hpi_sample_clock_query_source(const u32 h_clock, const u32 index,
2295        u16 *pw_source)
2296{
2297        u32 qr;
2298        u16 err;
2299
2300        err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_SOURCE, index, 0,
2301                &qr);
2302        *pw_source = (u16)qr;
2303        return err;
2304}
2305
2306u16 hpi_sample_clock_set_source(u32 h_control, u16 source)
2307{
2308        return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_SOURCE,
2309                source, 0);
2310}
2311
2312u16 hpi_sample_clock_get_source(u32 h_control, u16 *pw_source)
2313{
2314        u16 err = 0;
2315        u32 source = 0;
2316        err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SOURCE,
2317                &source);
2318        if (!err)
2319                if (pw_source)
2320                        *pw_source = (u16)source;
2321        return err;
2322}
2323
2324u16 hpi_sample_clock_query_source_index(const u32 h_clock, const u32 index,
2325        const u32 source, u16 *pw_source_index)
2326{
2327        u32 qr;
2328        u16 err;
2329
2330        err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_SOURCE_INDEX, index,
2331                source, &qr);
2332        *pw_source_index = (u16)qr;
2333        return err;
2334}
2335
2336u16 hpi_sample_clock_set_source_index(u32 h_control, u16 source_index)
2337{
2338        return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_SOURCE_INDEX,
2339                source_index, 0);
2340}
2341
2342u16 hpi_sample_clock_get_source_index(u32 h_control, u16 *pw_source_index)
2343{
2344        u16 err = 0;
2345        u32 source_index = 0;
2346        err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SOURCE_INDEX,
2347                &source_index);
2348        if (!err)
2349                if (pw_source_index)
2350                        *pw_source_index = (u16)source_index;
2351        return err;
2352}
2353
2354u16 hpi_sample_clock_query_local_rate(const u32 h_clock, const u32 index,
2355        u32 *prate)
2356{
2357        u16 err;
2358        err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_LOCAL_SAMPLERATE,
2359                index, 0, prate);
2360
2361        return err;
2362}
2363
2364u16 hpi_sample_clock_set_local_rate(u32 h_control, u32 sample_rate)
2365{
2366        return hpi_control_param_set(h_control,
2367                HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, sample_rate, 0);
2368}
2369
2370u16 hpi_sample_clock_get_local_rate(u32 h_control, u32 *psample_rate)
2371{
2372        u16 err = 0;
2373        u32 sample_rate = 0;
2374        err = hpi_control_param1_get(h_control,
2375                HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, &sample_rate);
2376        if (!err)
2377                if (psample_rate)
2378                        *psample_rate = sample_rate;
2379        return err;
2380}
2381
2382u16 hpi_sample_clock_get_sample_rate(u32 h_control, u32 *psample_rate)
2383{
2384        u16 err = 0;
2385        u32 sample_rate = 0;
2386        err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SAMPLERATE,
2387                &sample_rate);
2388        if (!err)
2389                if (psample_rate)
2390                        *psample_rate = sample_rate;
2391        return err;
2392}
2393
2394u16 hpi_sample_clock_set_auto(u32 h_control, u32 enable)
2395{
2396        return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_AUTO, enable,
2397                0);
2398}
2399
2400u16 hpi_sample_clock_get_auto(u32 h_control, u32 *penable)
2401{
2402        return hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_AUTO,
2403                penable);
2404}
2405
2406u16 hpi_sample_clock_set_local_rate_lock(u32 h_control, u32 lock)
2407{
2408        return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_LOCAL_LOCK,
2409                lock, 0);
2410}
2411
2412u16 hpi_sample_clock_get_local_rate_lock(u32 h_control, u32 *plock)
2413{
2414        return hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_LOCAL_LOCK,
2415                plock);
2416}
2417
2418u16 hpi_tone_detector_get_frequency(u32 h_control, u32 index, u32 *frequency)
2419{
2420        return hpi_control_param_get(h_control, HPI_TONEDETECTOR_FREQUENCY,
2421                index, 0, frequency, NULL);
2422}
2423
2424u16 hpi_tone_detector_get_state(u32 h_control, u32 *state)
2425{
2426        return hpi_control_param1_get(h_control, HPI_TONEDETECTOR_STATE,
2427                state);
2428}
2429
2430u16 hpi_tone_detector_set_enable(u32 h_control, u32 enable)
2431{
2432        return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
2433                0);
2434}
2435
2436u16 hpi_tone_detector_get_enable(u32 h_control, u32 *enable)
2437{
2438        return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
2439}
2440
2441u16 hpi_tone_detector_set_event_enable(u32 h_control, u32 event_enable)
2442{
2443        return hpi_control_param_set(h_control, HPI_GENERIC_EVENT_ENABLE,
2444                (u32)event_enable, 0);
2445}
2446
2447u16 hpi_tone_detector_get_event_enable(u32 h_control, u32 *event_enable)
2448{
2449        return hpi_control_param1_get(h_control, HPI_GENERIC_EVENT_ENABLE,
2450                event_enable);
2451}
2452
2453u16 hpi_tone_detector_set_threshold(u32 h_control, int threshold)
2454{
2455        return hpi_control_param_set(h_control, HPI_TONEDETECTOR_THRESHOLD,
2456                (u32)threshold, 0);
2457}
2458
2459u16 hpi_tone_detector_get_threshold(u32 h_control, int *threshold)
2460{
2461        return hpi_control_param1_get(h_control, HPI_TONEDETECTOR_THRESHOLD,
2462                (u32 *)threshold);
2463}
2464
2465u16 hpi_silence_detector_get_state(u32 h_control, u32 *state)
2466{
2467        return hpi_control_param1_get(h_control, HPI_SILENCEDETECTOR_STATE,
2468                state);
2469}
2470
2471u16 hpi_silence_detector_set_enable(u32 h_control, u32 enable)
2472{
2473        return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
2474                0);
2475}
2476
2477u16 hpi_silence_detector_get_enable(u32 h_control, u32 *enable)
2478{
2479        return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
2480}
2481
2482u16 hpi_silence_detector_set_event_enable(u32 h_control, u32 event_enable)
2483{
2484        return hpi_control_param_set(h_control, HPI_GENERIC_EVENT_ENABLE,
2485                event_enable, 0);
2486}
2487
2488u16 hpi_silence_detector_get_event_enable(u32 h_control, u32 *event_enable)
2489{
2490        return hpi_control_param1_get(h_control, HPI_GENERIC_EVENT_ENABLE,
2491                event_enable);
2492}
2493
2494u16 hpi_silence_detector_set_delay(u32 h_control, u32 delay)
2495{
2496        return hpi_control_param_set(h_control, HPI_SILENCEDETECTOR_DELAY,
2497                delay, 0);
2498}
2499
2500u16 hpi_silence_detector_get_delay(u32 h_control, u32 *delay)
2501{
2502        return hpi_control_param1_get(h_control, HPI_SILENCEDETECTOR_DELAY,
2503                delay);
2504}
2505
2506u16 hpi_silence_detector_set_threshold(u32 h_control, int threshold)
2507{
2508        return hpi_control_param_set(h_control, HPI_SILENCEDETECTOR_THRESHOLD,
2509                threshold, 0);
2510}
2511
2512u16 hpi_silence_detector_get_threshold(u32 h_control, int *threshold)
2513{
2514        return hpi_control_param1_get(h_control,
2515                HPI_SILENCEDETECTOR_THRESHOLD, (u32 *)threshold);
2516}
2517
2518u16 hpi_tuner_query_band(const u32 h_tuner, const u32 index, u16 *pw_band)
2519{
2520        u32 qr;
2521        u16 err;
2522
2523        err = hpi_control_query(h_tuner, HPI_TUNER_BAND, index, 0, &qr);
2524        *pw_band = (u16)qr;
2525        return err;
2526}
2527
2528u16 hpi_tuner_set_band(u32 h_control, u16 band)
2529{
2530        return hpi_control_param_set(h_control, HPI_TUNER_BAND, band, 0);
2531}
2532
2533u16 hpi_tuner_get_band(u32 h_control, u16 *pw_band)
2534{
2535        u32 band = 0;
2536        u16 error = 0;
2537
2538        error = hpi_control_param1_get(h_control, HPI_TUNER_BAND, &band);
2539        if (pw_band)
2540                *pw_band = (u16)band;
2541        return error;
2542}
2543
2544u16 hpi_tuner_query_frequency(const u32 h_tuner, const u32 index,
2545        const u16 band, u32 *pfreq)
2546{
2547        return hpi_control_query(h_tuner, HPI_TUNER_FREQ, index, band, pfreq);
2548}
2549
2550u16 hpi_tuner_set_frequency(u32 h_control, u32 freq_ink_hz)
2551{
2552        return hpi_control_param_set(h_control, HPI_TUNER_FREQ, freq_ink_hz,
2553                0);
2554}
2555
2556u16 hpi_tuner_get_frequency(u32 h_control, u32 *pw_freq_ink_hz)
2557{
2558        return hpi_control_param1_get(h_control, HPI_TUNER_FREQ,
2559                pw_freq_ink_hz);
2560}
2561
2562u16 hpi_tuner_query_gain(const u32 h_tuner, const u32 index, u16 *pw_gain)
2563{
2564        u32 qr;
2565        u16 err;
2566
2567        err = hpi_control_query(h_tuner, HPI_TUNER_BAND, index, 0, &qr);
2568        *pw_gain = (u16)qr;
2569        return err;
2570}
2571
2572u16 hpi_tuner_set_gain(u32 h_control, short gain)
2573{
2574        return hpi_control_param_set(h_control, HPI_TUNER_GAIN, gain, 0);
2575}
2576
2577u16 hpi_tuner_get_gain(u32 h_control, short *pn_gain)
2578{
2579        u32 gain = 0;
2580        u16 error = 0;
2581
2582        error = hpi_control_param1_get(h_control, HPI_TUNER_GAIN, &gain);
2583        if (pn_gain)
2584                *pn_gain = (u16)gain;
2585        return error;
2586}
2587
2588u16 hpi_tuner_get_rf_level(u32 h_control, short *pw_level)
2589{
2590        struct hpi_message hm;
2591        struct hpi_response hr;
2592
2593        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2594                HPI_CONTROL_GET_STATE);
2595        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2596                return HPI_ERROR_INVALID_HANDLE;
2597        hm.u.cu.attribute = HPI_TUNER_LEVEL_AVG;
2598        hpi_send_recv(&hm, &hr);
2599        if (pw_level)
2600                *pw_level = hr.u.cu.tuner.s_level;
2601        return hr.error;
2602}
2603
2604u16 hpi_tuner_get_raw_rf_level(u32 h_control, short *pw_level)
2605{
2606        struct hpi_message hm;
2607        struct hpi_response hr;
2608
2609        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2610                HPI_CONTROL_GET_STATE);
2611        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2612                return HPI_ERROR_INVALID_HANDLE;
2613        hm.u.cu.attribute = HPI_TUNER_LEVEL_RAW;
2614        hpi_send_recv(&hm, &hr);
2615        if (pw_level)
2616                *pw_level = hr.u.cu.tuner.s_level;
2617        return hr.error;
2618}
2619
2620u16 hpi_tuner_query_deemphasis(const u32 h_tuner, const u32 index,
2621        const u16 band, u32 *pdeemphasis)
2622{
2623        return hpi_control_query(h_tuner, HPI_TUNER_DEEMPHASIS, index, band,
2624                pdeemphasis);
2625}
2626
2627u16 hpi_tuner_set_deemphasis(u32 h_control, u32 deemphasis)
2628{
2629        return hpi_control_param_set(h_control, HPI_TUNER_DEEMPHASIS,
2630                deemphasis, 0);
2631}
2632
2633u16 hpi_tuner_get_deemphasis(u32 h_control, u32 *pdeemphasis)
2634{
2635        return hpi_control_param1_get(h_control, HPI_TUNER_DEEMPHASIS,
2636                pdeemphasis);
2637}
2638
2639u16 hpi_tuner_query_program(const u32 h_tuner, u32 *pbitmap_program)
2640{
2641        return hpi_control_query(h_tuner, HPI_TUNER_PROGRAM, 0, 0,
2642                pbitmap_program);
2643}
2644
2645u16 hpi_tuner_set_program(u32 h_control, u32 program)
2646{
2647        return hpi_control_param_set(h_control, HPI_TUNER_PROGRAM, program,
2648                0);
2649}
2650
2651u16 hpi_tuner_get_program(u32 h_control, u32 *pprogram)
2652{
2653        return hpi_control_param1_get(h_control, HPI_TUNER_PROGRAM, pprogram);
2654}
2655
2656u16 hpi_tuner_get_hd_radio_dsp_version(u32 h_control, char *psz_dsp_version,
2657        const u32 string_size)
2658{
2659        return hpi_control_get_string(h_control,
2660                HPI_TUNER_HDRADIO_DSP_VERSION, psz_dsp_version, string_size);
2661}
2662
2663u16 hpi_tuner_get_hd_radio_sdk_version(u32 h_control, char *psz_sdk_version,
2664        const u32 string_size)
2665{
2666        return hpi_control_get_string(h_control,
2667                HPI_TUNER_HDRADIO_SDK_VERSION, psz_sdk_version, string_size);
2668}
2669
2670u16 hpi_tuner_get_status(u32 h_control, u16 *pw_status_mask, u16 *pw_status)
2671{
2672        u32 status = 0;
2673        u16 error = 0;
2674
2675        error = hpi_control_param1_get(h_control, HPI_TUNER_STATUS, &status);
2676        if (pw_status) {
2677                if (!error) {
2678                        *pw_status_mask = (u16)(status >> 16);
2679                        *pw_status = (u16)(status & 0xFFFF);
2680                } else {
2681                        *pw_status_mask = 0;
2682                        *pw_status = 0;
2683                }
2684        }
2685        return error;
2686}
2687
2688u16 hpi_tuner_set_mode(u32 h_control, u32 mode, u32 value)
2689{
2690        return hpi_control_param_set(h_control, HPI_TUNER_MODE, mode, value);
2691}
2692
2693u16 hpi_tuner_get_mode(u32 h_control, u32 mode, u32 *pn_value)
2694{
2695        return hpi_control_param_get(h_control, HPI_TUNER_MODE, mode, 0,
2696                pn_value, NULL);
2697}
2698
2699u16 hpi_tuner_get_hd_radio_signal_quality(u32 h_control, u32 *pquality)
2700{
2701        return hpi_control_param1_get(h_control,
2702                HPI_TUNER_HDRADIO_SIGNAL_QUALITY, pquality);
2703}
2704
2705u16 hpi_tuner_get_hd_radio_signal_blend(u32 h_control, u32 *pblend)
2706{
2707        return hpi_control_param1_get(h_control, HPI_TUNER_HDRADIO_BLEND,
2708                pblend);
2709}
2710
2711u16 hpi_tuner_set_hd_radio_signal_blend(u32 h_control, const u32 blend)
2712{
2713        return hpi_control_param_set(h_control, HPI_TUNER_HDRADIO_BLEND,
2714                blend, 0);
2715}
2716
2717u16 hpi_tuner_get_rds(u32 h_control, char *p_data)
2718{
2719        struct hpi_message hm;
2720        struct hpi_response hr;
2721
2722        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2723                HPI_CONTROL_GET_STATE);
2724        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2725                return HPI_ERROR_INVALID_HANDLE;
2726        hm.u.c.attribute = HPI_TUNER_RDS;
2727        hpi_send_recv(&hm, &hr);
2728        if (p_data) {
2729                *(u32 *)&p_data[0] = hr.u.cu.tuner.rds.data[0];
2730                *(u32 *)&p_data[4] = hr.u.cu.tuner.rds.data[1];
2731                *(u32 *)&p_data[8] = hr.u.cu.tuner.rds.bLER;
2732        }
2733        return hr.error;
2734}
2735
2736u16 hpi_pad_get_channel_name(u32 h_control, char *psz_string,
2737        const u32 data_length)
2738{
2739        return hpi_control_get_string(h_control, HPI_PAD_CHANNEL_NAME,
2740                psz_string, data_length);
2741}
2742
2743u16 hpi_pad_get_artist(u32 h_control, char *psz_string, const u32 data_length)
2744{
2745        return hpi_control_get_string(h_control, HPI_PAD_ARTIST, psz_string,
2746                data_length);
2747}
2748
2749u16 hpi_pad_get_title(u32 h_control, char *psz_string, const u32 data_length)
2750{
2751        return hpi_control_get_string(h_control, HPI_PAD_TITLE, psz_string,
2752                data_length);
2753}
2754
2755u16 hpi_pad_get_comment(u32 h_control, char *psz_string,
2756        const u32 data_length)
2757{
2758        return hpi_control_get_string(h_control, HPI_PAD_COMMENT, psz_string,
2759                data_length);
2760}
2761
2762u16 hpi_pad_get_program_type(u32 h_control, u32 *ppTY)
2763{
2764        return hpi_control_param1_get(h_control, HPI_PAD_PROGRAM_TYPE, ppTY);
2765}
2766
2767u16 hpi_pad_get_rdsPI(u32 h_control, u32 *ppI)
2768{
2769        return hpi_control_param1_get(h_control, HPI_PAD_PROGRAM_ID, ppI);
2770}
2771
2772u16 hpi_volume_query_channels(const u32 h_volume, u32 *p_channels)
2773{
2774        return hpi_control_query(h_volume, HPI_VOLUME_NUM_CHANNELS, 0, 0,
2775                p_channels);
2776}
2777
2778u16 hpi_volume_set_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS]
2779        )
2780{
2781        return hpi_control_log_set2(h_control, HPI_VOLUME_GAIN,
2782                an_log_gain[0], an_log_gain[1]);
2783}
2784
2785u16 hpi_volume_get_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS]
2786        )
2787{
2788        return hpi_control_log_get2(h_control, HPI_VOLUME_GAIN,
2789                &an_log_gain[0], &an_log_gain[1]);
2790}
2791
2792u16 hpi_volume_set_mute(u32 h_control, u32 mute)
2793{
2794        return hpi_control_param_set(h_control, HPI_VOLUME_MUTE, mute, 0);
2795}
2796
2797u16 hpi_volume_get_mute(u32 h_control, u32 *mute)
2798{
2799        return hpi_control_param1_get(h_control, HPI_VOLUME_MUTE, mute);
2800}
2801
2802u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB,
2803        short *max_gain_01dB, short *step_gain_01dB)
2804{
2805        struct hpi_message hm;
2806        struct hpi_response hr;
2807
2808        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2809                HPI_CONTROL_GET_STATE);
2810        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2811                return HPI_ERROR_INVALID_HANDLE;
2812        hm.u.c.attribute = HPI_VOLUME_RANGE;
2813
2814        hpi_send_recv(&hm, &hr);
2815        if (hr.error) {
2816                hr.u.c.an_log_value[0] = 0;
2817                hr.u.c.an_log_value[1] = 0;
2818                hr.u.c.param1 = 0;
2819        }
2820        if (min_gain_01dB)
2821                *min_gain_01dB = hr.u.c.an_log_value[0];
2822        if (max_gain_01dB)
2823                *max_gain_01dB = hr.u.c.an_log_value[1];
2824        if (step_gain_01dB)
2825                *step_gain_01dB = (short)hr.u.c.param1;
2826        return hr.error;
2827}
2828
2829u16 hpi_volume_auto_fade_profile(u32 h_control,
2830        short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms,
2831        u16 profile)
2832{
2833        struct hpi_message hm;
2834        struct hpi_response hr;
2835
2836        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2837                HPI_CONTROL_SET_STATE);
2838        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2839                return HPI_ERROR_INVALID_HANDLE;
2840
2841        memcpy(hm.u.c.an_log_value, an_stop_gain0_01dB,
2842                sizeof(short) * HPI_MAX_CHANNELS);
2843
2844        hm.u.c.attribute = HPI_VOLUME_AUTOFADE;
2845        hm.u.c.param1 = duration_ms;
2846        hm.u.c.param2 = profile;
2847
2848        hpi_send_recv(&hm, &hr);
2849
2850        return hr.error;
2851}
2852
2853u16 hpi_volume_auto_fade(u32 h_control,
2854        short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms)
2855{
2856        return hpi_volume_auto_fade_profile(h_control, an_stop_gain0_01dB,
2857                duration_ms, HPI_VOLUME_AUTOFADE_LOG);
2858}
2859
2860u16 hpi_vox_set_threshold(u32 h_control, short an_gain0_01dB)
2861{
2862        struct hpi_message hm;
2863        struct hpi_response hr;
2864        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2865                HPI_CONTROL_SET_STATE);
2866        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2867                return HPI_ERROR_INVALID_HANDLE;
2868        hm.u.c.attribute = HPI_VOX_THRESHOLD;
2869
2870        hm.u.c.an_log_value[0] = an_gain0_01dB;
2871
2872        hpi_send_recv(&hm, &hr);
2873
2874        return hr.error;
2875}
2876
2877u16 hpi_vox_get_threshold(u32 h_control, short *an_gain0_01dB)
2878{
2879        struct hpi_message hm;
2880        struct hpi_response hr;
2881        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2882                HPI_CONTROL_GET_STATE);
2883        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2884                return HPI_ERROR_INVALID_HANDLE;
2885        hm.u.c.attribute = HPI_VOX_THRESHOLD;
2886
2887        hpi_send_recv(&hm, &hr);
2888
2889        *an_gain0_01dB = hr.u.c.an_log_value[0];
2890
2891        return hr.error;
2892}
2893