Lines Matching +full:address +full:- +full:data

1 // SPDX-License-Identifier: GPL-2.0
3 * ddbridge-ci.c: Digital Devices bridge CI (DuoFlex, CI Bridge) support
5 * Copyright (C) 2010-2017 Digital Devices GmbH
11 #include "ddbridge-regs.h"
12 #include "ddbridge-ci.h"
13 #include "ddbridge-io.h"
14 #include "ddbridge-i2c.h"
26 if (ddbreadl(ci->port->dev, in wait_ci_ready()
27 CI_CONTROL(ci->nr)) & CI_READY) in wait_ci_ready()
30 if ((--count) == 0) in wait_ci_ready()
31 return -1; in wait_ci_ready()
37 int slot, int address) in read_attribute_mem() argument
39 struct ddb_ci *ci = ca->data; in read_attribute_mem()
40 u32 val, off = (address >> 1) & (CI_BUFFER_SIZE - 1); in read_attribute_mem()
42 if (address > CI_BUFFER_SIZE) in read_attribute_mem()
43 return -1; in read_attribute_mem()
44 ddbwritel(ci->port->dev, CI_READ_CMD | (1 << 16) | address, in read_attribute_mem()
45 CI_DO_READ_ATTRIBUTES(ci->nr)); in read_attribute_mem()
47 val = 0xff & ddbreadl(ci->port->dev, CI_BUFFER(ci->nr) + off); in read_attribute_mem()
52 int address, u8 value) in write_attribute_mem() argument
54 struct ddb_ci *ci = ca->data; in write_attribute_mem()
56 ddbwritel(ci->port->dev, CI_WRITE_CMD | (value << 16) | address, in write_attribute_mem()
57 CI_DO_ATTRIBUTE_RW(ci->nr)); in write_attribute_mem()
63 int slot, u8 address) in read_cam_control() argument
66 struct ddb_ci *ci = ca->data; in read_cam_control()
69 ddbwritel(ci->port->dev, CI_READ_CMD | address, in read_cam_control()
70 CI_DO_IO_RW(ci->nr)); in read_cam_control()
73 res = ddbreadl(ci->port->dev, CI_READDATA(ci->nr)); in read_cam_control()
77 if ((--count) == 0) in read_cam_control()
78 return -1; in read_cam_control()
84 u8 address, u8 value) in write_cam_control() argument
86 struct ddb_ci *ci = ca->data; in write_cam_control()
88 ddbwritel(ci->port->dev, CI_WRITE_CMD | (value << 16) | address, in write_cam_control()
89 CI_DO_IO_RW(ci->nr)); in write_cam_control()
96 struct ddb_ci *ci = ca->data; in slot_reset()
98 ddbwritel(ci->port->dev, CI_POWER_ON, in slot_reset()
99 CI_CONTROL(ci->nr)); in slot_reset()
101 ddbwritel(ci->port->dev, CI_POWER_ON | CI_RESET_CAM, in slot_reset()
102 CI_CONTROL(ci->nr)); in slot_reset()
103 ddbwritel(ci->port->dev, CI_ENABLE | CI_POWER_ON | CI_RESET_CAM, in slot_reset()
104 CI_CONTROL(ci->nr)); in slot_reset()
106 ddbwritel(ci->port->dev, CI_ENABLE | CI_POWER_ON, in slot_reset()
107 CI_CONTROL(ci->nr)); in slot_reset()
113 struct ddb_ci *ci = ca->data; in slot_shutdown()
115 ddbwritel(ci->port->dev, 0, CI_CONTROL(ci->nr)); in slot_shutdown()
122 struct ddb_ci *ci = ca->data; in slot_ts_enable()
123 u32 val = ddbreadl(ci->port->dev, CI_CONTROL(ci->nr)); in slot_ts_enable()
125 ddbwritel(ci->port->dev, val | CI_BYPASS_DISABLE, in slot_ts_enable()
126 CI_CONTROL(ci->nr)); in slot_ts_enable()
132 struct ddb_ci *ci = ca->data; in poll_slot_status()
133 u32 val = ddbreadl(ci->port->dev, CI_CONTROL(ci->nr)); in poll_slot_status()
161 memcpy(&ci->en, &en_templ, sizeof(en_templ)); in ci_attach()
162 ci->en.data = ci; in ci_attach()
163 port->en = &ci->en; in ci_attach()
164 port->en_freedata = 1; in ci_attach()
165 ci->port = port; in ci_attach()
166 ci->nr = port->nr - 2; in ci_attach()
171 static int write_creg(struct ddb_ci *ci, u8 data, u8 mask) in write_creg() argument
173 struct i2c_adapter *i2c = &ci->port->i2c->adap; in write_creg()
174 u8 adr = (ci->port->type == DDB_CI_EXTERNAL_XO2) ? 0x12 : 0x13; in write_creg()
176 ci->port->creg = (ci->port->creg & ~mask) | data; in write_creg()
177 return i2c_write_reg(i2c, adr, 0x02, ci->port->creg); in write_creg()
181 int slot, int address) in read_attribute_mem_xo2() argument
183 struct ddb_ci *ci = ca->data; in read_attribute_mem_xo2()
184 struct i2c_adapter *i2c = &ci->port->i2c->adap; in read_attribute_mem_xo2()
185 u8 adr = (ci->port->type == DDB_CI_EXTERNAL_XO2) ? 0x12 : 0x13; in read_attribute_mem_xo2()
189 res = i2c_read_reg16(i2c, adr, 0x8000 | address, &val); in read_attribute_mem_xo2()
194 int address, u8 value) in write_attribute_mem_xo2() argument
196 struct ddb_ci *ci = ca->data; in write_attribute_mem_xo2()
197 struct i2c_adapter *i2c = &ci->port->i2c->adap; in write_attribute_mem_xo2()
198 u8 adr = (ci->port->type == DDB_CI_EXTERNAL_XO2) ? 0x12 : 0x13; in write_attribute_mem_xo2()
200 return i2c_write_reg16(i2c, adr, 0x8000 | address, value); in write_attribute_mem_xo2()
204 int slot, u8 address) in read_cam_control_xo2() argument
206 struct ddb_ci *ci = ca->data; in read_cam_control_xo2()
207 struct i2c_adapter *i2c = &ci->port->i2c->adap; in read_cam_control_xo2()
208 u8 adr = (ci->port->type == DDB_CI_EXTERNAL_XO2) ? 0x12 : 0x13; in read_cam_control_xo2()
212 res = i2c_read_reg(i2c, adr, 0x20 | (address & 3), &val); in read_cam_control_xo2()
217 u8 address, u8 value) in write_cam_control_xo2() argument
219 struct ddb_ci *ci = ca->data; in write_cam_control_xo2()
220 struct i2c_adapter *i2c = &ci->port->i2c->adap; in write_cam_control_xo2()
221 u8 adr = (ci->port->type == DDB_CI_EXTERNAL_XO2) ? 0x12 : 0x13; in write_cam_control_xo2()
223 return i2c_write_reg(i2c, adr, 0x20 | (address & 3), value); in write_cam_control_xo2()
228 struct ddb_ci *ci = ca->data; in slot_reset_xo2()
230 dev_dbg(ci->port->dev->dev, "%s\n", __func__); in slot_reset_xo2()
242 struct ddb_ci *ci = ca->data; in slot_shutdown_xo2()
244 dev_dbg(ci->port->dev->dev, "%s\n", __func__); in slot_shutdown_xo2()
252 struct ddb_ci *ci = ca->data; in slot_ts_enable_xo2()
254 dev_dbg(ci->port->dev->dev, "%s\n", __func__); in slot_ts_enable_xo2()
261 struct ddb_ci *ci = ca->data; in poll_slot_status_xo2()
262 struct i2c_adapter *i2c = &ci->port->i2c->adap; in poll_slot_status_xo2()
263 u8 adr = (ci->port->type == DDB_CI_EXTERNAL_XO2) ? 0x12 : 0x13; in poll_slot_status_xo2()
294 memcpy(&ci->en, &en_xo2_templ, sizeof(en_xo2_templ)); in ci_xo2_attach()
295 ci->en.data = ci; in ci_xo2_attach()
296 port->en = &ci->en; in ci_xo2_attach()
297 port->en_freedata = 1; in ci_xo2_attach()
298 ci->port = port; in ci_xo2_attach()
299 ci->nr = port->nr - 2; in ci_xo2_attach()
300 ci->port->creg = 0; in ci_xo2_attach()
318 cxd_cfg.en = &port->en; in ci_cxd2099_attach()
320 client = dvb_module_probe("cxd2099", NULL, &port->i2c->adap, in ci_cxd2099_attach()
325 port->dvb[0].i2c_client[0] = client; in ci_cxd2099_attach()
326 port->en_freedata = 0; in ci_cxd2099_attach()
330 dev_err(port->dev->dev, "CXD2099AR attach failed\n"); in ci_cxd2099_attach()
331 return -ENODEV; in ci_cxd2099_attach()
338 switch (port->type) { in ddb_ci_attach()
342 return -ENODEV; in ddb_ci_attach()
352 return -ENODEV; in ddb_ci_attach()
355 if (!port->en) in ddb_ci_attach()
356 return -ENODEV; in ddb_ci_attach()
357 dvb_ca_en50221_init(port->dvb[0].adap, port->en, 0, 1); in ddb_ci_attach()
363 if (port->dvb[0].dev) in ddb_ci_detach()
364 dvb_unregister_device(port->dvb[0].dev); in ddb_ci_detach()
365 if (port->en) { in ddb_ci_detach()
366 dvb_ca_en50221_release(port->en); in ddb_ci_detach()
368 dvb_module_release(port->dvb[0].i2c_client[0]); in ddb_ci_detach()
369 port->dvb[0].i2c_client[0] = NULL; in ddb_ci_detach()
372 if (port->en_freedata) in ddb_ci_detach()
373 kfree(port->en->data); in ddb_ci_detach()
375 port->en = NULL; in ddb_ci_detach()