/alps/pcitool

To get this branch, use:
bzr branch http://suren.me/webbzr/alps/pcitool

« back to all changes in this revision

Viewing changes to views/register.c

  • Committer: Suren A. Chilingaryan
  • Date: 2015-10-18 01:47:47 UTC
  • Revision ID: csa@suren.me-20151018014747-9ji2ygdhz1l9wnt5
Support properties of arbitrary type

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#define _PCILIB_VIEW_ENUM_C
 
2
 
 
3
#include <stdio.h>
 
4
#include <unistd.h>
 
5
#include <stdlib.h>
 
6
#include <string.h>
 
7
#include <strings.h>
 
8
 
 
9
#include <uthash.h>
 
10
 
 
11
#include "error.h"
 
12
#include "version.h"
 
13
#include "model.h"
 
14
#include "enum.h"
 
15
#include "view.h"
 
16
#include "value.h"
 
17
#include "register.h"
 
18
 
 
19
 
 
20
static void pcilib_register_view_free(pcilib_t *ctx, pcilib_view_description_t *view) {
 
21
    if (view->name)
 
22
        free((void*)view->name);
 
23
    free(view);
 
24
}
 
25
 
 
26
static int pcilib_register_view_read(pcilib_t *ctx, pcilib_view_context_t *view_ctx, pcilib_register_value_t dummy, pcilib_value_t *val) {
 
27
    int err;
 
28
 
 
29
    const pcilib_model_description_t *model_info = pcilib_get_model_description(ctx);
 
30
    pcilib_register_view_description_t *v = (pcilib_register_view_description_t*)(model_info->views[view_ctx->view]);
 
31
 
 
32
    if (v->view) {
 
33
        return pcilib_read_register_view(ctx, v->bank, v->reg, v->view, val);
 
34
    } else {
 
35
        pcilib_register_value_t regval;
 
36
 
 
37
        err = pcilib_read_register(ctx, v->bank, v->reg, &regval);
 
38
        if (err) return err;
 
39
 
 
40
        return pcilib_set_value_from_register_value(ctx, val, regval);
 
41
    }
 
42
}
 
43
 
 
44
static int pcilib_register_view_write(pcilib_t *ctx, pcilib_view_context_t *view_ctx, pcilib_register_value_t *dummy, const pcilib_value_t *val) {
 
45
    int err;
 
46
 
 
47
    const pcilib_model_description_t *model_info = pcilib_get_model_description(ctx);
 
48
    pcilib_register_view_description_t *v = (pcilib_register_view_description_t*)(model_info->views[view_ctx->view]);
 
49
 
 
50
    if (v->view) {
 
51
        return pcilib_write_register_view(ctx, v->bank, v->reg, v->view, val);
 
52
    } else {
 
53
        pcilib_register_value_t regval;
 
54
 
 
55
        regval = pcilib_get_value_as_register_value(ctx, val, &err);
 
56
        if (err) return err;
 
57
 
 
58
        return pcilib_write_register(ctx, v->bank, v->reg, regval);
 
59
    }
 
60
 
 
61
    return err;
 
62
}
 
63
 
 
64
const pcilib_view_api_description_t pcilib_register_view_api =
 
65
  { PCILIB_VERSION, sizeof(pcilib_register_view_description_t), NULL, NULL, pcilib_register_view_free,  pcilib_register_view_read,  pcilib_register_view_write };