Merge branch 'linux-3.10.y' of git://git.kernel.org/pub/scm/linux/kernel/git/stable...
[firefly-linux-kernel-4.4.55.git] / tools / gator / daemon / Driver.cpp
1 /**
2  * Copyright (C) ARM Limited 2013-2015. All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  */
8
9 #include "Driver.h"
10
11 #include "Buffer.h"
12 #include "SessionData.h"
13
14 DriverCounter::DriverCounter(DriverCounter *const next, const char *const name) : mNext(next), mName(name), mKey(getEventKey()), mEnabled(false) {
15 }
16
17 DriverCounter::~DriverCounter() {
18         delete mName;
19 }
20
21 Driver *Driver::head = NULL;
22
23 Driver::Driver() : next(head) {
24         head = this;
25 }
26
27 SimpleDriver::~SimpleDriver() {
28         DriverCounter *counters = mCounters;
29         while (counters != NULL) {
30                 DriverCounter *counter = counters;
31                 counters = counter->getNext();
32                 delete counter;
33         }
34 }
35
36 DriverCounter *SimpleDriver::findCounter(const Counter &counter) const {
37         for (DriverCounter *driverCounter = mCounters; driverCounter != NULL; driverCounter = driverCounter->getNext()) {
38                 if (strcmp(driverCounter->getName(), counter.getType()) == 0) {
39                         return driverCounter;
40                 }
41         }
42
43         return NULL;
44 }
45
46 bool SimpleDriver::claimCounter(const Counter &counter) const {
47         return findCounter(counter) != NULL;
48 }
49
50 bool SimpleDriver::countersEnabled() const {
51         for (DriverCounter *counter = mCounters; counter != NULL; counter = counter->getNext()) {
52                 if (counter->isEnabled()) {
53                         return true;
54                 }
55         }
56         return false;
57 }
58
59 void SimpleDriver::resetCounters() {
60         for (DriverCounter *counter = mCounters; counter != NULL; counter = counter->getNext()) {
61                 counter->setEnabled(false);
62         }
63 }
64
65 void SimpleDriver::setupCounter(Counter &counter) {
66         DriverCounter *const driverCounter = findCounter(counter);
67         if (driverCounter == NULL) {
68                 counter.setEnabled(false);
69                 return;
70         }
71         driverCounter->setEnabled(true);
72         counter.setKey(driverCounter->getKey());
73 }
74
75 int SimpleDriver::writeCounters(mxml_node_t *root) const {
76         int count = 0;
77         for (DriverCounter *counter = mCounters; counter != NULL; counter = counter->getNext()) {
78                 mxml_node_t *node = mxmlNewElement(root, "counter");
79                 mxmlElementSetAttr(node, "name", counter->getName());
80                 ++count;
81         }
82
83         return count;
84 }
85
86 PolledDriver::~PolledDriver() {
87 }
88
89 void PolledDriver::read(Buffer *const buffer) {
90         for (DriverCounter *counter = getCounters(); counter != NULL; counter = counter->getNext()) {
91                 if (!counter->isEnabled()) {
92                         continue;
93                 }
94                 buffer->event64(counter->getKey(), counter->read());
95         }
96 }