1 // SPDX-License-Identifier: GPL-2.0
3 * ddbridge-max.c: Digital Devices bridge MAX card support
5 * Copyright (C) 2010-2017 Digital Devices GmbH
6 * Ralph Metzler <rjkm@metzlerbros.de>
7 * Marcus Metzler <mocm@metzlerbros.de>
10 #include <linux/module.h>
11 #include <linux/init.h>
12 #include <linux/interrupt.h>
13 #include <linux/delay.h>
14 #include <linux/slab.h>
15 #include <linux/poll.h>
17 #include <linux/pci.h>
18 #include <linux/pci_ids.h>
19 #include <linux/timer.h>
20 #include <linux/i2c.h>
21 #include <linux/swab.h>
22 #include <linux/vmalloc.h>
25 #include "ddbridge-regs.h"
26 #include "ddbridge-io.h"
27 #include "ddbridge-mci.h"
29 #include "ddbridge-max.h"
32 /******************************************************************************/
34 /* MaxS4/8 related modparams */
36 module_param(fmode
, int, 0444);
37 MODULE_PARM_DESC(fmode
, "frontend emulation mode");
39 static int fmode_sat
= -1;
40 module_param(fmode_sat
, int, 0444);
41 MODULE_PARM_DESC(fmode_sat
, "set frontend emulation mode sat");
43 static int old_quattro
;
44 module_param(old_quattro
, int, 0444);
45 MODULE_PARM_DESC(old_quattro
, "old quattro LNB input order ");
47 /******************************************************************************/
49 static int lnb_command(struct ddb
*dev
, u32 link
, u32 lnb
, u32 cmd
)
51 u32 c
, v
= 0, tag
= DDB_LINK_TAG(link
);
53 v
= LNB_TONE
& (dev
->link
[link
].lnb
.tone
<< (15 - lnb
));
54 ddbwritel(dev
, cmd
| v
, tag
| LNB_CONTROL(lnb
));
55 for (c
= 0; c
< 10; c
++) {
56 v
= ddbreadl(dev
, tag
| LNB_CONTROL(lnb
));
57 if ((v
& LNB_BUSY
) == 0)
62 dev_info(dev
->dev
, "%s lnb = %08x cmd = %08x\n",
67 static int max_send_master_cmd(struct dvb_frontend
*fe
,
68 struct dvb_diseqc_master_cmd
*cmd
)
70 struct ddb_input
*input
= fe
->sec_priv
;
71 struct ddb_port
*port
= input
->port
;
72 struct ddb
*dev
= port
->dev
;
73 struct ddb_dvb
*dvb
= &port
->dvb
[input
->nr
& 1];
74 u32 tag
= DDB_LINK_TAG(port
->lnr
);
76 u32 fmode
= dev
->link
[port
->lnr
].lnb
.fmode
;
78 if (fmode
== 2 || fmode
== 1)
80 if (dvb
->diseqc_send_master_cmd
)
81 dvb
->diseqc_send_master_cmd(fe
, cmd
);
83 mutex_lock(&dev
->link
[port
->lnr
].lnb
.lock
);
84 ddbwritel(dev
, 0, tag
| LNB_BUF_LEVEL(dvb
->input
));
85 for (i
= 0; i
< cmd
->msg_len
; i
++)
86 ddbwritel(dev
, cmd
->msg
[i
], tag
| LNB_BUF_WRITE(dvb
->input
));
87 lnb_command(dev
, port
->lnr
, dvb
->input
, LNB_CMD_DISEQC
);
88 mutex_unlock(&dev
->link
[port
->lnr
].lnb
.lock
);
92 static int lnb_send_diseqc(struct ddb
*dev
, u32 link
, u32 input
,
93 struct dvb_diseqc_master_cmd
*cmd
)
95 u32 tag
= DDB_LINK_TAG(link
);
98 ddbwritel(dev
, 0, tag
| LNB_BUF_LEVEL(input
));
99 for (i
= 0; i
< cmd
->msg_len
; i
++)
100 ddbwritel(dev
, cmd
->msg
[i
], tag
| LNB_BUF_WRITE(input
));
101 lnb_command(dev
, link
, input
, LNB_CMD_DISEQC
);
105 static int lnb_set_sat(struct ddb
*dev
, u32 link
, u32 input
, u32 sat
, u32 band
,
108 struct dvb_diseqc_master_cmd cmd
= {
109 .msg
= {0xe0, 0x10, 0x38, 0xf0, 0x00, 0x00},
112 cmd
.msg
[3] = 0xf0 | (((sat
<< 2) & 0x0c) | (band
? 1 : 0) |
114 return lnb_send_diseqc(dev
, link
, input
, &cmd
);
117 static int lnb_set_tone(struct ddb
*dev
, u32 link
, u32 input
,
118 enum fe_sec_tone_mode tone
)
121 u32 mask
= (1ULL << input
);
125 if (!(dev
->link
[link
].lnb
.tone
& mask
))
127 dev
->link
[link
].lnb
.tone
&= ~(1ULL << input
);
130 if (dev
->link
[link
].lnb
.tone
& mask
)
132 dev
->link
[link
].lnb
.tone
|= (1ULL << input
);
139 s
= lnb_command(dev
, link
, input
, LNB_CMD_NOP
);
143 static int lnb_set_voltage(struct ddb
*dev
, u32 link
, u32 input
,
144 enum fe_sec_voltage voltage
)
148 if (dev
->link
[link
].lnb
.oldvoltage
[input
] == voltage
)
151 case SEC_VOLTAGE_OFF
:
152 if (dev
->link
[link
].lnb
.voltage
[input
])
154 lnb_command(dev
, link
, input
, LNB_CMD_OFF
);
157 lnb_command(dev
, link
, input
, LNB_CMD_LOW
);
160 lnb_command(dev
, link
, input
, LNB_CMD_HIGH
);
166 dev
->link
[link
].lnb
.oldvoltage
[input
] = voltage
;
170 static int max_set_input_unlocked(struct dvb_frontend
*fe
, int in
)
172 struct ddb_input
*input
= fe
->sec_priv
;
173 struct ddb_port
*port
= input
->port
;
174 struct ddb
*dev
= port
->dev
;
175 struct ddb_dvb
*dvb
= &port
->dvb
[input
->nr
& 1];
180 if (dvb
->input
!= in
) {
181 u32 bit
= (1ULL << input
->nr
);
183 dev
->link
[port
->lnr
].lnb
.voltage
[dvb
->input
& 3] & bit
;
185 dev
->link
[port
->lnr
].lnb
.voltage
[dvb
->input
& 3] &= ~bit
;
187 dev
->link
[port
->lnr
].lnb
.voltage
[dvb
->input
& 3] |= obit
;
189 res
= dvb
->set_input(fe
, in
);
193 static int max_set_tone(struct dvb_frontend
*fe
, enum fe_sec_tone_mode tone
)
195 struct ddb_input
*input
= fe
->sec_priv
;
196 struct ddb_port
*port
= input
->port
;
197 struct ddb
*dev
= port
->dev
;
198 struct ddb_dvb
*dvb
= &port
->dvb
[input
->nr
& 1];
201 u32 fmode
= dev
->link
[port
->lnr
].lnb
.fmode
;
203 mutex_lock(&dev
->link
[port
->lnr
].lnb
.lock
);
209 res
= lnb_set_tone(dev
, port
->lnr
, dvb
->input
, tone
);
214 if (dvb
->tone
== SEC_TONE_ON
)
216 if (dvb
->voltage
== SEC_VOLTAGE_18
)
219 if (dvb
->tone
== SEC_TONE_ON
)
221 if (dvb
->voltage
== SEC_VOLTAGE_18
)
224 res
= max_set_input_unlocked(fe
, tuner
);
227 mutex_unlock(&dev
->link
[port
->lnr
].lnb
.lock
);
231 static int max_set_voltage(struct dvb_frontend
*fe
, enum fe_sec_voltage voltage
)
233 struct ddb_input
*input
= fe
->sec_priv
;
234 struct ddb_port
*port
= input
->port
;
235 struct ddb
*dev
= port
->dev
;
236 struct ddb_dvb
*dvb
= &port
->dvb
[input
->nr
& 1];
238 u32 nv
, ov
= dev
->link
[port
->lnr
].lnb
.voltages
;
240 u32 fmode
= dev
->link
[port
->lnr
].lnb
.fmode
;
242 mutex_lock(&dev
->link
[port
->lnr
].lnb
.lock
);
243 dvb
->voltage
= voltage
;
250 max_set_input_unlocked(fe
, 0);
251 if (voltage
== SEC_VOLTAGE_OFF
)
252 dev
->link
[port
->lnr
].lnb
.voltage
[dvb
->input
] &=
253 ~(1ULL << input
->nr
);
255 dev
->link
[port
->lnr
].lnb
.voltage
[dvb
->input
] |=
258 res
= lnb_set_voltage(dev
, port
->lnr
, dvb
->input
, voltage
);
262 if (voltage
== SEC_VOLTAGE_OFF
)
263 dev
->link
[port
->lnr
].lnb
.voltages
&=
264 ~(1ULL << input
->nr
);
266 dev
->link
[port
->lnr
].lnb
.voltages
|=
269 nv
= dev
->link
[port
->lnr
].lnb
.voltages
;
272 if (dvb
->tone
== SEC_TONE_ON
)
274 if (dvb
->voltage
== SEC_VOLTAGE_18
)
277 if (dvb
->tone
== SEC_TONE_ON
)
279 if (dvb
->voltage
== SEC_VOLTAGE_18
)
282 res
= max_set_input_unlocked(fe
, tuner
);
331 mutex_unlock(&dev
->link
[port
->lnr
].lnb
.lock
);
335 static int max_enable_high_lnb_voltage(struct dvb_frontend
*fe
, long arg
)
340 static int max_send_burst(struct dvb_frontend
*fe
, enum fe_sec_mini_cmd burst
)
345 static int mxl_fw_read(void *priv
, u8
*buf
, u32 len
)
347 struct ddb_link
*link
= priv
;
348 struct ddb
*dev
= link
->dev
;
350 dev_info(dev
->dev
, "Read mxl_fw from link %u\n", link
->nr
);
352 return ddbridge_flashread(dev
, link
->nr
, buf
, 0xc0000, len
);
355 int ddb_lnb_init_fmode(struct ddb
*dev
, struct ddb_link
*link
, u32 fm
)
359 if (link
->lnb
.fmode
== fm
)
361 dev_info(dev
->dev
, "Set fmode link %u = %u\n", l
, fm
);
362 mutex_lock(&link
->lnb
.lock
);
363 if (fm
== 2 || fm
== 1) {
364 if (fmode_sat
>= 0) {
365 lnb_set_sat(dev
, l
, 0, fmode_sat
, 0, 0);
367 lnb_set_sat(dev
, l
, 1, fmode_sat
, 0, 1);
368 lnb_set_sat(dev
, l
, 2, fmode_sat
, 1, 0);
370 lnb_set_sat(dev
, l
, 1, fmode_sat
, 1, 0);
371 lnb_set_sat(dev
, l
, 2, fmode_sat
, 0, 1);
373 lnb_set_sat(dev
, l
, 3, fmode_sat
, 1, 1);
375 lnb_set_tone(dev
, l
, 0, SEC_TONE_OFF
);
377 lnb_set_tone(dev
, l
, 1, SEC_TONE_OFF
);
378 lnb_set_tone(dev
, l
, 2, SEC_TONE_ON
);
380 lnb_set_tone(dev
, l
, 1, SEC_TONE_ON
);
381 lnb_set_tone(dev
, l
, 2, SEC_TONE_OFF
);
383 lnb_set_tone(dev
, l
, 3, SEC_TONE_ON
);
385 link
->lnb
.fmode
= fm
;
386 mutex_unlock(&link
->lnb
.lock
);
390 static struct mxl5xx_cfg mxl5xx
= {
396 .fw_read
= mxl_fw_read
,
399 int ddb_fe_attach_mxl5xx(struct ddb_input
*input
)
401 struct ddb
*dev
= input
->port
->dev
;
402 struct i2c_adapter
*i2c
= &input
->port
->i2c
->adap
;
403 struct ddb_dvb
*dvb
= &input
->port
->dvb
[input
->nr
& 1];
404 struct ddb_port
*port
= input
->port
;
405 struct ddb_link
*link
= &dev
->link
[port
->lnr
];
406 struct mxl5xx_cfg cfg
;
411 dvb
->set_input
= NULL
;
418 dvb
->fe
= dvb_attach(mxl5xx_attach
, i2c
, &cfg
,
419 demod
, tuner
, &dvb
->set_input
);
422 dev_err(dev
->dev
, "No MXL5XX found!\n");
426 if (!dvb
->set_input
) {
427 dev_err(dev
->dev
, "No mxl5xx_set_input function pointer!\n");
432 lnb_command(dev
, port
->lnr
, input
->nr
, LNB_CMD_INIT
);
433 lnb_set_voltage(dev
, port
->lnr
, input
->nr
, SEC_VOLTAGE_OFF
);
435 ddb_lnb_init_fmode(dev
, link
, fmode
);
437 dvb
->fe
->ops
.set_voltage
= max_set_voltage
;
438 dvb
->fe
->ops
.enable_high_lnb_voltage
= max_enable_high_lnb_voltage
;
439 dvb
->fe
->ops
.set_tone
= max_set_tone
;
440 dvb
->diseqc_send_master_cmd
= dvb
->fe
->ops
.diseqc_send_master_cmd
;
441 dvb
->fe
->ops
.diseqc_send_master_cmd
= max_send_master_cmd
;
442 dvb
->fe
->ops
.diseqc_send_burst
= max_send_burst
;
443 dvb
->fe
->sec_priv
= input
;
448 /******************************************************************************/
449 /* MAX MCI related functions */
451 int ddb_fe_attach_mci(struct ddb_input
*input
, u32 type
)
453 struct ddb
*dev
= input
->port
->dev
;
454 struct ddb_dvb
*dvb
= &input
->port
->dvb
[input
->nr
& 1];
455 struct ddb_port
*port
= input
->port
;
456 struct ddb_link
*link
= &dev
->link
[port
->lnr
];
463 case DDB_TUNER_MCI_SX8
:
464 cfg
= ddb_max_sx8_cfg
;
471 dvb
->fe
= ddb_mci_attach(input
, &cfg
, demod
, &dvb
->set_input
);
473 dev_err(dev
->dev
, "No MCI card found!\n");
476 if (!dvb
->set_input
) {
477 dev_err(dev
->dev
, "No MCI set_input function pointer!\n");
481 lnb_command(dev
, port
->lnr
, input
->nr
, LNB_CMD_INIT
);
482 lnb_set_voltage(dev
, port
->lnr
, input
->nr
, SEC_VOLTAGE_OFF
);
484 ddb_lnb_init_fmode(dev
, link
, fmode
);
486 dvb
->fe
->ops
.set_voltage
= max_set_voltage
;
487 dvb
->fe
->ops
.enable_high_lnb_voltage
= max_enable_high_lnb_voltage
;
488 dvb
->fe
->ops
.set_tone
= max_set_tone
;
489 dvb
->diseqc_send_master_cmd
= dvb
->fe
->ops
.diseqc_send_master_cmd
;
490 dvb
->fe
->ops
.diseqc_send_master_cmd
= max_send_master_cmd
;
491 dvb
->fe
->ops
.diseqc_send_burst
= max_send_burst
;
492 dvb
->fe
->sec_priv
= input
;