aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/es1968.c
diff options
context:
space:
mode:
authorOndrej Zary <linux@rainbow-software.org>2011-05-09 17:39:37 -0400
committerTakashi Iwai <tiwai@suse.de>2011-05-10 03:31:29 -0400
commit72587173cc31bb96db63e347b94ad0ef84878cea (patch)
tree38c81f3ca0b141d993fc16e1fd839ef19725c8fb /sound/pci/es1968.c
parent14219d06592025541559027d0fd8f96ef75f313c (diff)
ALSA: es1968: convert TEA575x support to new interface
Use common functions to access TEA575x tuner - remove original read/write functions and provide new pin manipulation functions instead. Tested with SF64-PCE2 card. Signed-off-by: Ondrej Zary <linux@rainbow-software.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/es1968.c')
-rw-r--r--sound/pci/es1968.c95
1 files changed, 24 insertions, 71 deletions
diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c
index faf9138970ae..75c5e0ed6955 100644
--- a/sound/pci/es1968.c
+++ b/sound/pci/es1968.c
@@ -2591,96 +2591,48 @@ static int __devinit snd_es1968_input_register(struct es1968 *chip)
2591#define STR_WREN 0x0100 /* GPIO8 */ 2591#define STR_WREN 0x0100 /* GPIO8 */
2592#define STR_MOST 0x0200 /* GPIO9 */ 2592#define STR_MOST 0x0200 /* GPIO9 */
2593 2593
2594static void snd_es1968_tea575x_write(struct snd_tea575x *tea, unsigned int val) 2594static void snd_es1968_tea575x_set_pins(struct snd_tea575x *tea, u8 pins)
2595{ 2595{
2596 struct es1968 *chip = tea->private_data; 2596 struct es1968 *chip = tea->private_data;
2597 unsigned long io = chip->io_port + GPIO_DATA; 2597 unsigned long io = chip->io_port + GPIO_DATA;
2598 u16 l, bits; 2598 u16 val = 0;
2599 u16 omask, odir;
2600 2599
2601 omask = inw(io + IO_MASK); 2600 val |= (pins & TEA575X_DATA) ? STR_DATA : 0;
2602 odir = (inw(io + IO_DIR) & ~STR_DATA) | (STR_CLK | STR_WREN); 2601 val |= (pins & TEA575X_CLK) ? STR_CLK : 0;
2603 outw(odir | STR_DATA, io + IO_DIR); 2602 val |= (pins & TEA575X_WREN) ? STR_WREN : 0;
2604 outw(~(STR_DATA | STR_CLK | STR_WREN), io + IO_MASK);
2605 udelay(16);
2606 2603
2607 for (l = 25; l; l--) { 2604 outw(val, io);
2608 bits = ((val >> 18) & STR_DATA) | STR_WREN;
2609 val <<= 1; /* shift data */
2610 outw(bits, io); /* start strobe */
2611 udelay(2);
2612 outw(bits | STR_CLK, io); /* HI level */
2613 udelay(2);
2614 outw(bits, io); /* LO level */
2615 udelay(4);
2616 }
2617
2618 if (!tea->mute)
2619 outw(0, io);
2620
2621 udelay(4);
2622 outw(omask, io + IO_MASK);
2623 outw(odir, io + IO_DIR);
2624 msleep(125);
2625} 2605}
2626 2606
2627static unsigned int snd_es1968_tea575x_read(struct snd_tea575x *tea) 2607static u8 snd_es1968_tea575x_get_pins(struct snd_tea575x *tea)
2628{ 2608{
2629 struct es1968 *chip = tea->private_data; 2609 struct es1968 *chip = tea->private_data;
2630 unsigned long io = chip->io_port + GPIO_DATA; 2610 unsigned long io = chip->io_port + GPIO_DATA;
2631 u16 l, rdata; 2611 u16 val = inw(io);
2632 u32 data = 0;
2633 u16 omask;
2634
2635 omask = inw(io + IO_MASK);
2636 outw(~(STR_CLK | STR_WREN), io + IO_MASK);
2637 outw(0, io);
2638 udelay(16);
2639
2640 for (l = 24; l--;) {
2641 outw(STR_CLK, io); /* HI state */
2642 udelay(2);
2643 if (!l)
2644 tea->tuned = inw(io) & STR_MOST ? 0 : 1;
2645 outw(0, io); /* LO state */
2646 udelay(2);
2647 data <<= 1; /* shift data */
2648 rdata = inw(io);
2649 if (!l)
2650 tea->stereo = (rdata & STR_MOST) ? 0 : 1;
2651 else if (l && rdata & STR_DATA)
2652 data++;
2653 udelay(2);
2654 }
2655
2656 if (tea->mute)
2657 outw(STR_WREN, io);
2658
2659 udelay(4);
2660 outw(omask, io + IO_MASK);
2661 2612
2662 return data & 0x3ffe; 2613 return (val & STR_DATA) ? TEA575X_DATA : 0 |
2614 (val & STR_MOST) ? TEA575X_MOST : 0;
2663} 2615}
2664 2616
2665static void snd_es1968_tea575x_mute(struct snd_tea575x *tea, unsigned int mute) 2617static void snd_es1968_tea575x_set_direction(struct snd_tea575x *tea, bool output)
2666{ 2618{
2667 struct es1968 *chip = tea->private_data; 2619 struct es1968 *chip = tea->private_data;
2668 unsigned long io = chip->io_port + GPIO_DATA; 2620 unsigned long io = chip->io_port + GPIO_DATA;
2669 u16 omask; 2621 u16 odir = inw(io + IO_DIR);
2670 2622
2671 omask = inw(io + IO_MASK); 2623 if (output) {
2672 outw(~STR_WREN, io + IO_MASK); 2624 outw(~(STR_DATA | STR_CLK | STR_WREN), io + IO_MASK);
2673 tea->mute = mute; 2625 outw(odir | STR_DATA | STR_CLK | STR_WREN, io + IO_DIR);
2674 outw(tea->mute ? STR_WREN : 0, io); 2626 } else {
2675 udelay(4); 2627 outw(~(STR_CLK | STR_WREN | STR_DATA | STR_MOST), io + IO_MASK);
2676 outw(omask, io + IO_MASK); 2628 outw((odir & ~(STR_DATA | STR_MOST)) | STR_CLK | STR_WREN, io + IO_DIR);
2677 msleep(125); 2629 }
2678} 2630}
2679 2631
2680static struct snd_tea575x_ops snd_es1968_tea_ops = { 2632static struct snd_tea575x_ops snd_es1968_tea_ops = {
2681 .write = snd_es1968_tea575x_write, 2633 .set_pins = snd_es1968_tea575x_set_pins,
2682 .read = snd_es1968_tea575x_read, 2634 .get_pins = snd_es1968_tea575x_get_pins,
2683 .mute = snd_es1968_tea575x_mute, 2635 .set_direction = snd_es1968_tea575x_set_direction,
2684}; 2636};
2685#endif 2637#endif
2686 2638
@@ -2845,7 +2797,8 @@ static int __devinit snd_es1968_create(struct snd_card *card,
2845 chip->tea.freq_fixup = 10700; 2797 chip->tea.freq_fixup = 10700;
2846 chip->tea.private_data = chip; 2798 chip->tea.private_data = chip;
2847 chip->tea.ops = &snd_es1968_tea_ops; 2799 chip->tea.ops = &snd_es1968_tea_ops;
2848 snd_tea575x_init(&chip->tea); 2800 if (!snd_tea575x_init(&chip->tea))
2801 printk(KERN_INFO "es1968: detected TEA575x radio\n");
2849#endif 2802#endif
2850 2803
2851 *chip_ret = chip; 2804 *chip_ret = chip;