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 --- |