2 * ddbridge-max.c: Digital Devices bridge MAX card support
4 * Copyright (C) 2010-2017 Digital Devices GmbH
5 * Ralph Metzler <rjkm@metzlerbros.de>
6 * Marcus Metzler <mocm@metzlerbros.de>
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * version 2 only, as published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
19 #include <linux/module.h>
20 #include <linux/init.h>
21 #include <linux/interrupt.h>
22 #include <linux/delay.h>
23 #include <linux/slab.h>
24 #include <linux/poll.h>
26 #include <linux/pci.h>
27 #include <linux/pci_ids.h>
28 #include <linux/timer.h>
29 #include <linux/i2c.h>
30 #include <linux/swab.h>
31 #include <linux/vmalloc.h>
34 #include "ddbridge-regs.h"
35 #include "ddbridge-io.h"
37 #include "ddbridge-max.h"
40 /******************************************************************************/
42 /* MaxS4/8 related modparams */
44 module_param(fmode
, int, 0444);
45 MODULE_PARM_DESC(fmode
, "frontend emulation mode");
47 static int fmode_sat
= -1;
48 module_param(fmode_sat
, int, 0444);
49 MODULE_PARM_DESC(fmode_sat
, "set frontend emulation mode sat");
51 static int old_quattro
;
52 module_param(old_quattro
, int, 0444);
53 MODULE_PARM_DESC(old_quattro
, "old quattro LNB input order ");
55 /******************************************************************************/
57 static int lnb_command(struct ddb
*dev
, u32 link
, u32 lnb
, u32 cmd
)
59 u32 c
, v
= 0, tag
= DDB_LINK_TAG(link
);
61 v
= LNB_TONE
& (dev
->link
[link
].lnb
.tone
<< (15 - lnb
));
62 ddbwritel(dev
, cmd
| v
, tag
| LNB_CONTROL(lnb
));
63 for (c
= 0; c
< 10; c
++) {
64 v
= ddbreadl(dev
, tag
| LNB_CONTROL(lnb
));
65 if ((v
& LNB_BUSY
) == 0)
70 dev_info(dev
->dev
, "%s lnb = %08x cmd = %08x\n",
75 static int max_send_master_cmd(struct dvb_frontend
*fe
,
76 struct dvb_diseqc_master_cmd
*cmd
)
78 struct ddb_input
*input
= fe
->sec_priv
;
79 struct ddb_port
*port
= input
->port
;
80 struct ddb
*dev
= port
->dev
;
81 struct ddb_dvb
*dvb
= &port
->dvb
[input
->nr
& 1];
82 u32 tag
= DDB_LINK_TAG(port
->lnr
);
84 u32 fmode
= dev
->link
[port
->lnr
].lnb
.fmode
;
86 if (fmode
== 2 || fmode
== 1)
88 if (dvb
->diseqc_send_master_cmd
)
89 dvb
->diseqc_send_master_cmd(fe
, cmd
);
91 mutex_lock(&dev
->link
[port
->lnr
].lnb
.lock
);
92 ddbwritel(dev
, 0, tag
| LNB_BUF_LEVEL(dvb
->input
));
93 for (i
= 0; i
< cmd
->msg_len
; i
++)
94 ddbwritel(dev
, cmd
->msg
[i
], tag
| LNB_BUF_WRITE(dvb
->input
));
95 lnb_command(dev
, port
->lnr
, dvb
->input
, LNB_CMD_DISEQC
);
96 mutex_unlock(&dev
->link
[port
->lnr
].lnb
.lock
);
100 static int lnb_send_diseqc(struct ddb
*dev
, u32 link
, u32 input
,
101 struct dvb_diseqc_master_cmd
*cmd
)
103 u32 tag
= DDB_LINK_TAG(link
);
106 ddbwritel(dev
, 0, tag
| LNB_BUF_LEVEL(input
));
107 for (i
= 0; i
< cmd
->msg_len
; i
++)
108 ddbwritel(dev
, cmd
->msg
[i
], tag
| LNB_BUF_WRITE(input
));
109 lnb_command(dev
, link
, input
, LNB_CMD_DISEQC
);
113 static int lnb_set_sat(struct ddb
*dev
, u32 link
, u32 input
, u32 sat
, u32 band
,
116 struct dvb_diseqc_master_cmd cmd
= {
117 .msg
= {0xe0, 0x10, 0x38, 0xf0, 0x00, 0x00},
120 cmd
.msg
[3] = 0xf0 | (((sat
<< 2) & 0x0c) | (band
? 1 : 0) |
122 return lnb_send_diseqc(dev
, link
, input
, &cmd
);
125 static int lnb_set_tone(struct ddb
*dev
, u32 link
, u32 input
,
126 enum fe_sec_tone_mode tone
)
129 u32 mask
= (1ULL << input
);
133 if (!(dev
->link
[link
].lnb
.tone
& mask
))
135 dev
->link
[link
].lnb
.tone
&= ~(1ULL << input
);
138 if (dev
->link
[link
].lnb
.tone
& mask
)
140 dev
->link
[link
].lnb
.tone
|= (1ULL << input
);
147 s
= lnb_command(dev
, link
, input
, LNB_CMD_NOP
);
151 static int lnb_set_voltage(struct ddb
*dev
, u32 link
, u32 input
,
152 enum fe_sec_voltage voltage
)
156 if (dev
->link
[link
].lnb
.oldvoltage
[input
] == voltage
)
159 case SEC_VOLTAGE_OFF
:
160 if (dev
->link
[link
].lnb
.voltage
[input
])
162 lnb_command(dev
, link
, input
, LNB_CMD_OFF
);
165 lnb_command(dev
, link
, input
, LNB_CMD_LOW
);
168 lnb_command(dev
, link
, input
, LNB_CMD_HIGH
);
174 dev
->link
[link
].lnb
.oldvoltage
[input
] = voltage
;
178 static int max_set_input_unlocked(struct dvb_frontend
*fe
, int in
)
180 struct ddb_input
*input
= fe
->sec_priv
;
181 struct ddb_port
*port
= input
->port
;
182 struct ddb
*dev
= port
->dev
;
183 struct ddb_dvb
*dvb
= &port
->dvb
[input
->nr
& 1];
188 if (dvb
->input
!= in
) {
189 u32 bit
= (1ULL << input
->nr
);
191 dev
->link
[port
->lnr
].lnb
.voltage
[dvb
->input
& 3] & bit
;
193 dev
->link
[port
->lnr
].lnb
.voltage
[dvb
->input
& 3] &= ~bit
;
195 dev
->link
[port
->lnr
].lnb
.voltage
[dvb
->input
& 3] |= obit
;
197 res
= dvb
->set_input(fe
, in
);
201 static int max_set_tone(struct dvb_frontend
*fe
, enum fe_sec_tone_mode tone
)
203 struct ddb_input
*input
= fe
->sec_priv
;
204 struct ddb_port
*port
= input
->port
;
205 struct ddb
*dev
= port
->dev
;
206 struct ddb_dvb
*dvb
= &port
->dvb
[input
->nr
& 1];
209 u32 fmode
= dev
->link
[port
->lnr
].lnb
.fmode
;
211 mutex_lock(&dev
->link
[port
->lnr
].lnb
.lock
);
217 res
= lnb_set_tone(dev
, port
->lnr
, dvb
->input
, tone
);
222 if (dvb
->tone
== SEC_TONE_ON
)
224 if (dvb
->voltage
== SEC_VOLTAGE_18
)
227 if (dvb
->tone
== SEC_TONE_ON
)
229 if (dvb
->voltage
== SEC_VOLTAGE_18
)
232 res
= max_set_input_unlocked(fe
, tuner
);
235 mutex_unlock(&dev
->link
[port
->lnr
].lnb
.lock
);
239 static int max_set_voltage(struct dvb_frontend
*fe
, enum fe_sec_voltage voltage
)
241 struct ddb_input
*input
= fe
->sec_priv
;
242 struct ddb_port
*port
= input
->port
;
243 struct ddb
*dev
= port
->dev
;
244 struct ddb_dvb
*dvb
= &port
->dvb
[input
->nr
& 1];
246 u32 nv
, ov
= dev
->link
[port
->lnr
].lnb
.voltages
;
248 u32 fmode
= dev
->link
[port
->lnr
].lnb
.fmode
;
250 mutex_lock(&dev
->link
[port
->lnr
].lnb
.lock
);
251 dvb
->voltage
= voltage
;
258 max_set_input_unlocked(fe
, 0);
259 if (voltage
== SEC_VOLTAGE_OFF
)
260 dev
->link
[port
->lnr
].lnb
.voltage
[dvb
->input
] &=
261 ~(1ULL << input
->nr
);
263 dev
->link
[port
->lnr
].lnb
.voltage
[dvb
->input
] |=
266 res
= lnb_set_voltage(dev
, port
->lnr
, dvb
->input
, voltage
);
270 if (voltage
== SEC_VOLTAGE_OFF
)
271 dev
->link
[port
->lnr
].lnb
.voltages
&=
272 ~(1ULL << input
->nr
);
274 dev
->link
[port
->lnr
].lnb
.voltages
|=
277 nv
= dev
->link
[port
->lnr
].lnb
.voltages
;
280 if (dvb
->tone
== SEC_TONE_ON
)
282 if (dvb
->voltage
== SEC_VOLTAGE_18
)
285 if (dvb
->tone
== SEC_TONE_ON
)
287 if (dvb
->voltage
== SEC_VOLTAGE_18
)
290 res
= max_set_input_unlocked(fe
, tuner
);
339 mutex_unlock(&dev
->link
[port
->lnr
].lnb
.lock
);
343 static int max_enable_high_lnb_voltage(struct dvb_frontend
*fe
, long arg
)
348 static int max_send_burst(struct dvb_frontend
*fe
, enum fe_sec_mini_cmd burst
)
353 static int mxl_fw_read(void *priv
, u8
*buf
, u32 len
)
355 struct ddb_link
*link
= priv
;
356 struct ddb
*dev
= link
->dev
;
358 dev_info(dev
->dev
, "Read mxl_fw from link %u\n", link
->nr
);
360 return ddbridge_flashread(dev
, link
->nr
, buf
, 0xc0000, len
);
363 int ddb_lnb_init_fmode(struct ddb
*dev
, struct ddb_link
*link
, u32 fm
)
367 if (link
->lnb
.fmode
== fm
)
369 dev_info(dev
->dev
, "Set fmode link %u = %u\n", l
, fm
);
370 mutex_lock(&link
->lnb
.lock
);
371 if (fm
== 2 || fm
== 1) {
372 if (fmode_sat
>= 0) {
373 lnb_set_sat(dev
, l
, 0, fmode_sat
, 0, 0);
375 lnb_set_sat(dev
, l
, 1, fmode_sat
, 0, 1);
376 lnb_set_sat(dev
, l
, 2, fmode_sat
, 1, 0);
378 lnb_set_sat(dev
, l
, 1, fmode_sat
, 1, 0);
379 lnb_set_sat(dev
, l
, 2, fmode_sat
, 0, 1);
381 lnb_set_sat(dev
, l
, 3, fmode_sat
, 1, 1);
383 lnb_set_tone(dev
, l
, 0, SEC_TONE_OFF
);
385 lnb_set_tone(dev
, l
, 1, SEC_TONE_OFF
);
386 lnb_set_tone(dev
, l
, 2, SEC_TONE_ON
);
388 lnb_set_tone(dev
, l
, 1, SEC_TONE_ON
);
389 lnb_set_tone(dev
, l
, 2, SEC_TONE_OFF
);
391 lnb_set_tone(dev
, l
, 3, SEC_TONE_ON
);
393 link
->lnb
.fmode
= fm
;
394 mutex_unlock(&link
->lnb
.lock
);
398 static struct mxl5xx_cfg mxl5xx
= {
404 .fw_read
= mxl_fw_read
,
407 int ddb_fe_attach_mxl5xx(struct ddb_input
*input
)
409 struct ddb
*dev
= input
->port
->dev
;
410 struct i2c_adapter
*i2c
= &input
->port
->i2c
->adap
;
411 struct ddb_dvb
*dvb
= &input
->port
->dvb
[input
->nr
& 1];
412 struct ddb_port
*port
= input
->port
;
413 struct ddb_link
*link
= &dev
->link
[port
->lnr
];
414 struct mxl5xx_cfg cfg
;
419 dvb
->set_input
= NULL
;
426 dvb
->fe
= dvb_attach(mxl5xx_attach
, i2c
, &cfg
,
427 demod
, tuner
, &dvb
->set_input
);
430 dev_err(dev
->dev
, "No MXL5XX found!\n");
434 if (!dvb
->set_input
) {
435 dev_err(dev
->dev
, "No mxl5xx_set_input function pointer!\n");
440 lnb_command(dev
, port
->lnr
, input
->nr
, LNB_CMD_INIT
);
441 lnb_set_voltage(dev
, port
->lnr
, input
->nr
, SEC_VOLTAGE_OFF
);
443 ddb_lnb_init_fmode(dev
, link
, fmode
);
445 dvb
->fe
->ops
.set_voltage
= max_set_voltage
;
446 dvb
->fe
->ops
.enable_high_lnb_voltage
= max_enable_high_lnb_voltage
;
447 dvb
->fe
->ops
.set_tone
= max_set_tone
;
448 dvb
->diseqc_send_master_cmd
= dvb
->fe
->ops
.diseqc_send_master_cmd
;
449 dvb
->fe
->ops
.diseqc_send_master_cmd
= max_send_master_cmd
;
450 dvb
->fe
->ops
.diseqc_send_burst
= max_send_burst
;
451 dvb
->fe
->sec_priv
= input
;