0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include "sp2_priv.h"
0016
0017 static int sp2_read_i2c(struct sp2 *s, u8 reg, u8 *buf, int len)
0018 {
0019 int ret;
0020 struct i2c_client *client = s->client;
0021 struct i2c_adapter *adap = client->adapter;
0022 struct i2c_msg msg[] = {
0023 {
0024 .addr = client->addr,
0025 .flags = 0,
0026 .buf = ®,
0027 .len = 1
0028 }, {
0029 .addr = client->addr,
0030 .flags = I2C_M_RD,
0031 .buf = buf,
0032 .len = len
0033 }
0034 };
0035
0036 ret = i2c_transfer(adap, msg, 2);
0037
0038 if (ret != 2) {
0039 dev_err(&client->dev, "i2c read error, reg = 0x%02x, status = %d\n",
0040 reg, ret);
0041 if (ret < 0)
0042 return ret;
0043 else
0044 return -EIO;
0045 }
0046
0047 dev_dbg(&s->client->dev, "addr=0x%04x, reg = 0x%02x, data = %02x\n",
0048 client->addr, reg, buf[0]);
0049
0050 return 0;
0051 }
0052
0053 static int sp2_write_i2c(struct sp2 *s, u8 reg, u8 *buf, int len)
0054 {
0055 int ret;
0056 u8 buffer[35];
0057 struct i2c_client *client = s->client;
0058 struct i2c_adapter *adap = client->adapter;
0059 struct i2c_msg msg = {
0060 .addr = client->addr,
0061 .flags = 0,
0062 .buf = &buffer[0],
0063 .len = len + 1
0064 };
0065
0066 if ((len + 1) > sizeof(buffer)) {
0067 dev_err(&client->dev, "i2c wr reg=%02x: len=%d is too big!\n",
0068 reg, len);
0069 return -EINVAL;
0070 }
0071
0072 buffer[0] = reg;
0073 memcpy(&buffer[1], buf, len);
0074
0075 ret = i2c_transfer(adap, &msg, 1);
0076
0077 if (ret != 1) {
0078 dev_err(&client->dev, "i2c write error, reg = 0x%02x, status = %d\n",
0079 reg, ret);
0080 if (ret < 0)
0081 return ret;
0082 else
0083 return -EIO;
0084 }
0085
0086 dev_dbg(&s->client->dev, "addr=0x%04x, reg = 0x%02x, data = %*ph\n",
0087 client->addr, reg, len, buf);
0088
0089 return 0;
0090 }
0091
0092 static int sp2_ci_op_cam(struct dvb_ca_en50221 *en50221, int slot, u8 acs,
0093 u8 read, int addr, u8 data)
0094 {
0095 struct sp2 *s = en50221->data;
0096 u8 store;
0097 int mem, ret;
0098 int (*ci_op_cam)(void*, u8, int, u8, int*) = s->ci_control;
0099
0100 if (slot != 0)
0101 return -EINVAL;
0102
0103
0104
0105
0106
0107 if (s->module_access_type != acs) {
0108 ret = sp2_read_i2c(s, 0x00, &store, 1);
0109
0110 if (ret)
0111 return ret;
0112
0113 store &= ~(SP2_MOD_CTL_ACS1 | SP2_MOD_CTL_ACS0);
0114 store |= acs;
0115
0116 ret = sp2_write_i2c(s, 0x00, &store, 1);
0117 if (ret)
0118 return ret;
0119 }
0120
0121 s->module_access_type = acs;
0122
0123
0124 if (ci_op_cam) {
0125 ret = ci_op_cam(s->priv, read, addr, data, &mem);
0126 } else {
0127 dev_err(&s->client->dev, "callback not defined");
0128 return -EINVAL;
0129 }
0130
0131 if (ret)
0132 return ret;
0133
0134 dev_dbg(&s->client->dev, "%s: slot=%d, addr=0x%04x, %s, data=%x",
0135 (read) ? "read" : "write", slot, addr,
0136 (acs == SP2_CI_ATTR_ACS) ? "attr" : "io",
0137 (read) ? mem : data);
0138
0139 if (read)
0140 return mem;
0141 else
0142 return 0;
0143
0144 }
0145
0146 int sp2_ci_read_attribute_mem(struct dvb_ca_en50221 *en50221,
0147 int slot, int addr)
0148 {
0149 return sp2_ci_op_cam(en50221, slot, SP2_CI_ATTR_ACS,
0150 SP2_CI_RD, addr, 0);
0151 }
0152
0153 int sp2_ci_write_attribute_mem(struct dvb_ca_en50221 *en50221,
0154 int slot, int addr, u8 data)
0155 {
0156 return sp2_ci_op_cam(en50221, slot, SP2_CI_ATTR_ACS,
0157 SP2_CI_WR, addr, data);
0158 }
0159
0160 int sp2_ci_read_cam_control(struct dvb_ca_en50221 *en50221,
0161 int slot, u8 addr)
0162 {
0163 return sp2_ci_op_cam(en50221, slot, SP2_CI_IO_ACS,
0164 SP2_CI_RD, addr, 0);
0165 }
0166
0167 int sp2_ci_write_cam_control(struct dvb_ca_en50221 *en50221,
0168 int slot, u8 addr, u8 data)
0169 {
0170 return sp2_ci_op_cam(en50221, slot, SP2_CI_IO_ACS,
0171 SP2_CI_WR, addr, data);
0172 }
0173
0174 int sp2_ci_slot_reset(struct dvb_ca_en50221 *en50221, int slot)
0175 {
0176 struct sp2 *s = en50221->data;
0177 u8 buf;
0178 int ret;
0179
0180 dev_dbg(&s->client->dev, "slot: %d\n", slot);
0181
0182 if (slot != 0)
0183 return -EINVAL;
0184
0185
0186 buf = SP2_MOD_CTL_RST;
0187 ret = sp2_write_i2c(s, 0x00, &buf, 1);
0188
0189 if (ret)
0190 return ret;
0191
0192 usleep_range(500, 600);
0193
0194
0195 buf = 0x00;
0196 ret = sp2_write_i2c(s, 0x00, &buf, 1);
0197
0198 if (ret)
0199 return ret;
0200
0201 msleep(1000);
0202
0203 return 0;
0204 }
0205
0206 int sp2_ci_slot_shutdown(struct dvb_ca_en50221 *en50221, int slot)
0207 {
0208 struct sp2 *s = en50221->data;
0209
0210 dev_dbg(&s->client->dev, "slot:%d\n", slot);
0211
0212
0213 return 0;
0214 }
0215
0216 int sp2_ci_slot_ts_enable(struct dvb_ca_en50221 *en50221, int slot)
0217 {
0218 struct sp2 *s = en50221->data;
0219 u8 buf;
0220
0221 dev_dbg(&s->client->dev, "slot:%d\n", slot);
0222
0223 if (slot != 0)
0224 return -EINVAL;
0225
0226 sp2_read_i2c(s, 0x00, &buf, 1);
0227
0228
0229 buf |= (SP2_MOD_CTL_TSOEN | SP2_MOD_CTL_TSIEN);
0230 return sp2_write_i2c(s, 0, &buf, 1);
0231 }
0232
0233 int sp2_ci_poll_slot_status(struct dvb_ca_en50221 *en50221,
0234 int slot, int open)
0235 {
0236 struct sp2 *s = en50221->data;
0237 u8 buf[2];
0238 int ret;
0239
0240 dev_dbg(&s->client->dev, "slot:%d open:%d\n", slot, open);
0241
0242
0243
0244
0245
0246 if (time_after(jiffies, s->next_status_checked_time)) {
0247 ret = sp2_read_i2c(s, 0x00, buf, 1);
0248 s->next_status_checked_time = jiffies + msecs_to_jiffies(1000);
0249
0250 if (ret)
0251 return 0;
0252
0253 if (buf[0] & SP2_MOD_CTL_DET)
0254 s->status = DVB_CA_EN50221_POLL_CAM_PRESENT |
0255 DVB_CA_EN50221_POLL_CAM_READY;
0256 else
0257 s->status = 0;
0258 }
0259
0260 return s->status;
0261 }
0262
0263 static int sp2_init(struct sp2 *s)
0264 {
0265 int ret = 0;
0266 u8 buf;
0267 u8 cimax_init[34] = {
0268 0x00,
0269 0x00,
0270 0x00,
0271 0x00,
0272 0x00,
0273 0x44,
0274 0x00,
0275 0x00,
0276 0x00,
0277 0x00,
0278 0x00,
0279 0x00,
0280 0x00,
0281 0x00,
0282 0x44,
0283 0x00,
0284 0x00,
0285 0x00,
0286 0x00,
0287 0x00,
0288 0x00,
0289 0x00,
0290 0x00,
0291 0x02,
0292 0x01,
0293 0x00,
0294 0x00,
0295 0x00,
0296 0x05,
0297 0x00,
0298 0x04,
0299 0x00,
0300 0x22,
0301 0x00,
0302 };
0303
0304 dev_dbg(&s->client->dev, "\n");
0305
0306 s->ca.owner = THIS_MODULE;
0307 s->ca.read_attribute_mem = sp2_ci_read_attribute_mem;
0308 s->ca.write_attribute_mem = sp2_ci_write_attribute_mem;
0309 s->ca.read_cam_control = sp2_ci_read_cam_control;
0310 s->ca.write_cam_control = sp2_ci_write_cam_control;
0311 s->ca.slot_reset = sp2_ci_slot_reset;
0312 s->ca.slot_shutdown = sp2_ci_slot_shutdown;
0313 s->ca.slot_ts_enable = sp2_ci_slot_ts_enable;
0314 s->ca.poll_slot_status = sp2_ci_poll_slot_status;
0315 s->ca.data = s;
0316 s->module_access_type = 0;
0317
0318
0319 ret = sp2_write_i2c(s, 0x00, &cimax_init[0], 34);
0320 if (ret)
0321 goto err;
0322
0323
0324 buf = 1;
0325 ret = sp2_write_i2c(s, 0x1f, &buf, 1);
0326 if (ret)
0327 goto err;
0328
0329
0330 ret = sp2_write_i2c(s, 0x18, &buf, 1);
0331 if (ret)
0332 goto err;
0333
0334 ret = dvb_ca_en50221_init(s->dvb_adap, &s->ca, 0, 1);
0335 if (ret)
0336 goto err;
0337
0338 return 0;
0339
0340 err:
0341 dev_dbg(&s->client->dev, "init failed=%d\n", ret);
0342 return ret;
0343 }
0344
0345 static int sp2_exit(struct i2c_client *client)
0346 {
0347 struct sp2 *s;
0348
0349 dev_dbg(&client->dev, "\n");
0350
0351 if (!client)
0352 return 0;
0353
0354 s = i2c_get_clientdata(client);
0355 if (!s)
0356 return 0;
0357
0358 if (!s->ca.data)
0359 return 0;
0360
0361 dvb_ca_en50221_release(&s->ca);
0362
0363 return 0;
0364 }
0365
0366 static int sp2_probe(struct i2c_client *client,
0367 const struct i2c_device_id *id)
0368 {
0369 struct sp2_config *cfg = client->dev.platform_data;
0370 struct sp2 *s;
0371 int ret;
0372
0373 dev_dbg(&client->dev, "\n");
0374
0375 s = kzalloc(sizeof(*s), GFP_KERNEL);
0376 if (!s) {
0377 ret = -ENOMEM;
0378 goto err;
0379 }
0380
0381 s->client = client;
0382 s->dvb_adap = cfg->dvb_adap;
0383 s->priv = cfg->priv;
0384 s->ci_control = cfg->ci_control;
0385
0386 i2c_set_clientdata(client, s);
0387
0388 ret = sp2_init(s);
0389 if (ret)
0390 goto err;
0391
0392 dev_info(&s->client->dev, "CIMaX SP2 successfully attached\n");
0393 return 0;
0394 err:
0395 dev_dbg(&client->dev, "init failed=%d\n", ret);
0396 kfree(s);
0397
0398 return ret;
0399 }
0400
0401 static int sp2_remove(struct i2c_client *client)
0402 {
0403 struct sp2 *s = i2c_get_clientdata(client);
0404
0405 dev_dbg(&client->dev, "\n");
0406 sp2_exit(client);
0407 kfree(s);
0408 return 0;
0409 }
0410
0411 static const struct i2c_device_id sp2_id[] = {
0412 {"sp2", 0},
0413 {}
0414 };
0415 MODULE_DEVICE_TABLE(i2c, sp2_id);
0416
0417 static struct i2c_driver sp2_driver = {
0418 .driver = {
0419 .name = "sp2",
0420 },
0421 .probe = sp2_probe,
0422 .remove = sp2_remove,
0423 .id_table = sp2_id,
0424 };
0425
0426 module_i2c_driver(sp2_driver);
0427
0428 MODULE_DESCRIPTION("CIMaX SP2/HF CI driver");
0429 MODULE_AUTHOR("Olli Salonen <olli.salonen@iki.fi>");
0430 MODULE_LICENSE("GPL");