10 #include <linux/module.h>
12 #include <linux/slab.h>
39 static int num_fmr2_cards;
41 static bool isa_registered;
42 static bool pnp_registered;
45 #define FMR2_PORT 0x384
48 #define STR_DATA (1 << 0)
49 #define STR_CLK (1 << 1)
50 #define STR_WREN (1 << 2)
51 #define STR_MOST (1 << 3)
53 #define PT_ST (1 << 4)
54 #define PT_CK (1 << 5)
55 #define PT_DATA (1 << 6)
57 #define FMR2_HASVOL (1 << 7)
81 static void fmr2_tea575x_set_direction(
struct snd_tea575x *tea,
bool output)
86 .set_pins = fmr2_tea575x_set_pins,
87 .get_pins = fmr2_tea575x_get_pins,
88 .set_direction = fmr2_tea575x_set_direction,
94 #define TC9154A_ATT_MAJ_0DB (1 << 0)
95 #define TC9154A_ATT_MAJ_10DB (1 << 1)
96 #define TC9154A_ATT_MAJ_20DB (1 << 2)
97 #define TC9154A_ATT_MAJ_30DB (1 << 3)
98 #define TC9154A_ATT_MAJ_40DB (1 << 4)
99 #define TC9154A_ATT_MAJ_50DB (1 << 5)
100 #define TC9154A_ATT_MAJ_60DB (1 << 6)
102 #define TC9154A_ATT_MIN_0DB (1 << 7)
103 #define TC9154A_ATT_MIN_2DB (1 << 8)
104 #define TC9154A_ATT_MIN_4DB (1 << 9)
105 #define TC9154A_ATT_MIN_6DB (1 << 10)
106 #define TC9154A_ATT_MIN_8DB (1 << 11)
108 #define TC9154A_CHANNEL_LEFT (1 << 13)
109 #define TC9154A_CHANNEL_RIGHT (1 << 14)
112 #define TC9154A_ATT_MAJ(x) (1 << x)
113 #define TC9154A_ATT_MIN(x) (1 << (7 + x))
115 static void tc9154a_set_pins(
struct fmr2 *fmr2,
u8 pins)
123 static void tc9154a_set_attenuation(
struct fmr2 *fmr2,
int att,
u32 channel)
132 for (i = 0; i < 18; i++) {
134 tc9154a_set_pins(fmr2, bit);
136 tc9154a_set_pins(fmr2, bit |
PT_CK);
138 tc9154a_set_pins(fmr2, bit);
143 tc9154a_set_pins(fmr2,
PT_ST);
145 tc9154a_set_pins(fmr2, 0);
157 balance = fmr2->
balance->cur.val;
161 volume = fmr2->
volume->cur.val;
169 right =
max(0, right + balance);
171 left =
max(0, left - balance);
180 .s_ctrl = fmr2_s_ctrl,
183 static int fmr2_tea_ext_init(
struct snd_tea575x *tea)
209 char *card_name = fmr2->
is_fmd2 ?
"SF16-FMD2" :
"SF16-FMR2";
212 for (i = 0; i < num_fmr2_cards; i++)
213 if (io == fmr2_cards[i]->io)
221 printk(
KERN_ERR "radio-sf16fmr2: I/O port 0x%x already in use\n", fmr2->
io);
233 fmr2->
tea.private_data = fmr2;
234 fmr2->
tea.radio_nr = radio_nr[num_fmr2_cards];
235 fmr2->
tea.ops = &fmr2_tea_ops;
236 fmr2->
tea.ext_init = fmr2_tea_ext_init;
239 fmr2->
is_fmd2 ?
"PnP" :
"ISA", dev_name(pdev));
242 printk(
KERN_ERR "radio-sf16fmr2: Unable to detect TEA575x tuner\n");
248 card_name, fmr2->
io);
254 struct fmr2 *fmr2 = kzalloc(
sizeof(*fmr2),
GFP_KERNEL);
263 fmr2_cards[num_fmr2_cards++] = fmr2;
272 struct fmr2 *fmr2 = kzalloc(
sizeof(*fmr2),
GFP_KERNEL);
277 ret = fmr2_probe(fmr2, &pdev->
dev, pnp_port_start(pdev, 0));
282 pnp_set_drvdata(pdev, fmr2);
283 fmr2_cards[num_fmr2_cards++] = fmr2;
288 static void __devexit fmr2_remove(
struct fmr2 *fmr2)
296 static int __devexit fmr2_isa_remove(
struct device *pdev,
unsigned int ndev)
306 fmr2_remove(pnp_get_drvdata(pdev));
307 pnp_set_drvdata(pdev,
NULL);
311 .match = fmr2_isa_match,
314 .name =
"radio-sf16fmr2",
319 .name =
"radio-sf16fmr2",
320 .id_table = fmr2_pnp_ids,
321 .probe = fmr2_pnp_probe,
325 static int __init fmr2_init(
void)
331 pnp_registered =
true;
334 isa_registered =
true;
336 return (pnp_registered || isa_registered) ? 0 :
ret;
339 static void __exit fmr2_exit(
void)