si2157.c (a83d7d17ad4c920b9b3f5330521fa346dddd3de3) si2157.c (e6b4380f3ef89601b1a77c327fe3aa7b5500b3f4)
1/*
2 * Silicon Labs Si2157 silicon tuner driver
3 *
4 * Copyright (C) 2014 Antti Palosaari <crope@iki.fi>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or

--- 6 unchanged lines hidden (view full) ---

15 */
16
17#include "si2157_priv.h"
18
19/* execute firmware command */
20static int si2157_cmd_execute(struct si2157 *s, struct si2157_cmd *cmd)
21{
22 int ret;
1/*
2 * Silicon Labs Si2157 silicon tuner driver
3 *
4 * Copyright (C) 2014 Antti Palosaari <crope@iki.fi>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or

--- 6 unchanged lines hidden (view full) ---

15 */
16
17#include "si2157_priv.h"
18
19/* execute firmware command */
20static int si2157_cmd_execute(struct si2157 *s, struct si2157_cmd *cmd)
21{
22 int ret;
23 u8 buf[1];
24 unsigned long timeout;
25
26 mutex_lock(&s->i2c_mutex);
27
23 unsigned long timeout;
24
25 mutex_lock(&s->i2c_mutex);
26
28 if (cmd->len) {
27 if (cmd->wlen) {
29 /* write cmd and args for firmware */
28 /* write cmd and args for firmware */
30 ret = i2c_master_send(s->client, cmd->args, cmd->len);
29 ret = i2c_master_send(s->client, cmd->args, cmd->wlen);
31 if (ret < 0) {
32 goto err_mutex_unlock;
30 if (ret < 0) {
31 goto err_mutex_unlock;
33 } else if (ret != cmd->len) {
32 } else if (ret != cmd->wlen) {
34 ret = -EREMOTEIO;
35 goto err_mutex_unlock;
36 }
37 }
38
33 ret = -EREMOTEIO;
34 goto err_mutex_unlock;
35 }
36 }
37
39 /* wait cmd execution terminate */
40 #define TIMEOUT 80
41 timeout = jiffies + msecs_to_jiffies(TIMEOUT);
42 while (!time_after(jiffies, timeout)) {
43 ret = i2c_master_recv(s->client, buf, 1);
44 if (ret < 0) {
45 goto err_mutex_unlock;
46 } else if (ret != 1) {
47 ret = -EREMOTEIO;
48 goto err_mutex_unlock;
38 if (cmd->rlen) {
39 /* wait cmd execution terminate */
40 #define TIMEOUT 80
41 timeout = jiffies + msecs_to_jiffies(TIMEOUT);
42 while (!time_after(jiffies, timeout)) {
43 ret = i2c_master_recv(s->client, cmd->args, cmd->rlen);
44 if (ret < 0) {
45 goto err_mutex_unlock;
46 } else if (ret != cmd->rlen) {
47 ret = -EREMOTEIO;
48 goto err_mutex_unlock;
49 }
50
51 /* firmware ready? */
52 if ((cmd->args[0] >> 7) & 0x01)
53 break;
49 }
50
54 }
55
51 /* firmware ready? */
52 if ((buf[0] >> 7) & 0x01)
53 break;
54 }
56 dev_dbg(&s->client->dev, "%s: cmd execution took %d ms\n",
57 __func__,
58 jiffies_to_msecs(jiffies) -
59 (jiffies_to_msecs(timeout) - TIMEOUT));
55
60
56 dev_dbg(&s->client->dev, "%s: cmd execution took %d ms\n", __func__,
57 jiffies_to_msecs(jiffies) -
58 (jiffies_to_msecs(timeout) - TIMEOUT));
59
60 if (!(buf[0] >> 7) & 0x01) {
61 ret = -ETIMEDOUT;
62 goto err_mutex_unlock;
63 } else {
64 ret = 0;
61 if (!((cmd->args[0] >> 7) & 0x01)) {
62 ret = -ETIMEDOUT;
63 goto err_mutex_unlock;
64 }
65 }
66
65 }
66
67 ret = 0;
68
67err_mutex_unlock:
68 mutex_unlock(&s->i2c_mutex);
69 if (ret)
70 goto err;
71
72 return 0;
73err:
74 dev_dbg(&s->client->dev, "%s: failed=%d\n", __func__, ret);

--- 17 unchanged lines hidden (view full) ---

92 int ret;
93 struct si2157_cmd cmd;
94
95 dev_dbg(&s->client->dev, "%s:\n", __func__);
96
97 s->active = false;
98
99 memcpy(cmd.args, "\x13", 1);
69err_mutex_unlock:
70 mutex_unlock(&s->i2c_mutex);
71 if (ret)
72 goto err;
73
74 return 0;
75err:
76 dev_dbg(&s->client->dev, "%s: failed=%d\n", __func__, ret);

--- 17 unchanged lines hidden (view full) ---

94 int ret;
95 struct si2157_cmd cmd;
96
97 dev_dbg(&s->client->dev, "%s:\n", __func__);
98
99 s->active = false;
100
101 memcpy(cmd.args, "\x13", 1);
100 cmd.len = 1;
102 cmd.wlen = 1;
103 cmd.rlen = 0;
101 ret = si2157_cmd_execute(s, &cmd);
102 if (ret)
103 goto err;
104
105 return 0;
106err:
107 dev_dbg(&s->client->dev, "%s: failed=%d\n", __func__, ret);
108 return ret;

--- 27 unchanged lines hidden (view full) ---

136 cmd.args[7] = 0x01;
137 cmd.args[8] = 0x01;
138 cmd.args[9] = 0x01;
139 cmd.args[10] = 0x01;
140 cmd.args[11] = 0x02;
141 cmd.args[12] = 0x00;
142 cmd.args[13] = 0x00;
143 cmd.args[14] = 0x01;
104 ret = si2157_cmd_execute(s, &cmd);
105 if (ret)
106 goto err;
107
108 return 0;
109err:
110 dev_dbg(&s->client->dev, "%s: failed=%d\n", __func__, ret);
111 return ret;

--- 27 unchanged lines hidden (view full) ---

139 cmd.args[7] = 0x01;
140 cmd.args[8] = 0x01;
141 cmd.args[9] = 0x01;
142 cmd.args[10] = 0x01;
143 cmd.args[11] = 0x02;
144 cmd.args[12] = 0x00;
145 cmd.args[13] = 0x00;
146 cmd.args[14] = 0x01;
144 cmd.len = 15;
147 cmd.wlen = 15;
148 cmd.rlen = 1;
145 ret = si2157_cmd_execute(s, &cmd);
146 if (ret)
147 goto err;
148
149 cmd.args[0] = 0x02;
149 ret = si2157_cmd_execute(s, &cmd);
150 if (ret)
151 goto err;
152
153 cmd.args[0] = 0x02;
150 cmd.len = 1;
154 cmd.wlen = 1;
155 cmd.rlen = 13;
151 ret = si2157_cmd_execute(s, &cmd);
152 if (ret)
153 goto err;
154
155 cmd.args[0] = 0x01;
156 cmd.args[1] = 0x01;
156 ret = si2157_cmd_execute(s, &cmd);
157 if (ret)
158 goto err;
159
160 cmd.args[0] = 0x01;
161 cmd.args[1] = 0x01;
157 cmd.len = 2;
162 cmd.wlen = 2;
163 cmd.rlen = 1;
158 ret = si2157_cmd_execute(s, &cmd);
159 if (ret)
160 goto err;
161
162 /* set frequency */
163 cmd.args[0] = 0x41;
164 cmd.args[1] = 0x00;
165 cmd.args[2] = 0x00;
166 cmd.args[3] = 0x00;
167 cmd.args[4] = (c->frequency >> 0) & 0xff;
168 cmd.args[5] = (c->frequency >> 8) & 0xff;
169 cmd.args[6] = (c->frequency >> 16) & 0xff;
170 cmd.args[7] = (c->frequency >> 24) & 0xff;
164 ret = si2157_cmd_execute(s, &cmd);
165 if (ret)
166 goto err;
167
168 /* set frequency */
169 cmd.args[0] = 0x41;
170 cmd.args[1] = 0x00;
171 cmd.args[2] = 0x00;
172 cmd.args[3] = 0x00;
173 cmd.args[4] = (c->frequency >> 0) & 0xff;
174 cmd.args[5] = (c->frequency >> 8) & 0xff;
175 cmd.args[6] = (c->frequency >> 16) & 0xff;
176 cmd.args[7] = (c->frequency >> 24) & 0xff;
171 cmd.len = 8;
177 cmd.wlen = 8;
178 cmd.rlen = 1;
172 ret = si2157_cmd_execute(s, &cmd);
173 if (ret)
174 goto err;
175
176 return 0;
177err:
178 dev_dbg(&s->client->dev, "%s: failed=%d\n", __func__, ret);
179 return ret;

--- 27 unchanged lines hidden (view full) ---

207 goto err;
208 }
209
210 s->client = client;
211 s->fe = cfg->fe;
212 mutex_init(&s->i2c_mutex);
213
214 /* check if the tuner is there */
179 ret = si2157_cmd_execute(s, &cmd);
180 if (ret)
181 goto err;
182
183 return 0;
184err:
185 dev_dbg(&s->client->dev, "%s: failed=%d\n", __func__, ret);
186 return ret;

--- 27 unchanged lines hidden (view full) ---

214 goto err;
215 }
216
217 s->client = client;
218 s->fe = cfg->fe;
219 mutex_init(&s->i2c_mutex);
220
221 /* check if the tuner is there */
215 cmd.len = 0;
222 cmd.wlen = 0;
223 cmd.rlen = 1;
216 ret = si2157_cmd_execute(s, &cmd);
217 if (ret)
218 goto err;
219
220 fe->tuner_priv = s;
221 memcpy(&fe->ops.tuner_ops, &si2157_tuner_ops,
222 sizeof(struct dvb_tuner_ops));
223

--- 48 unchanged lines hidden ---
224 ret = si2157_cmd_execute(s, &cmd);
225 if (ret)
226 goto err;
227
228 fe->tuner_priv = s;
229 memcpy(&fe->ops.tuner_ops, &si2157_tuner_ops,
230 sizeof(struct dvb_tuner_ops));
231

--- 48 unchanged lines hidden ---