diff options
-rw-r--r-- | include/sound/ad1848.h | 32 | ||||
-rw-r--r-- | include/sound/wss.h | 6 | ||||
-rw-r--r-- | sound/isa/ad1848/ad1848.c | 2 | ||||
-rw-r--r-- | sound/isa/ad1848/ad1848_lib.c | 48 | ||||
-rw-r--r-- | sound/isa/cmi8330.c | 4 | ||||
-rw-r--r-- | sound/isa/opti9xx/opti92x-ad1848.c | 2 | ||||
-rw-r--r-- | sound/isa/sc6000.c | 2 | ||||
-rw-r--r-- | sound/isa/sgalaxy.c | 2 |
8 files changed, 42 insertions, 56 deletions
diff --git a/include/sound/ad1848.h b/include/sound/ad1848.h index d740e633e81b..a881d5173c64 100644 --- a/include/sound/ad1848.h +++ b/include/sound/ad1848.h | |||
@@ -106,24 +106,6 @@ | |||
106 | #define AD1848_CALIB_IN_PROGRESS 0x20 /* auto calibrate in progress */ | 106 | #define AD1848_CALIB_IN_PROGRESS 0x20 /* auto calibrate in progress */ |
107 | #define AD1848_DMA_REQUEST 0x10 /* DMA request in progress */ | 107 | #define AD1848_DMA_REQUEST 0x10 /* DMA request in progress */ |
108 | 108 | ||
109 | /* defines for codec.mode */ | ||
110 | |||
111 | #define AD1848_MODE_NONE 0x0000 | ||
112 | #define AD1848_MODE_PLAY 0x0001 | ||
113 | #define AD1848_MODE_CAPTURE 0x0002 | ||
114 | #define AD1848_MODE_TIMER 0x0004 | ||
115 | #define AD1848_MODE_OPEN (AD1848_MODE_PLAY|AD1848_MODE_CAPTURE|AD1848_MODE_TIMER) | ||
116 | #define AD1848_MODE_RUNNING 0x0010 | ||
117 | |||
118 | /* defines for codec.hardware */ | ||
119 | |||
120 | #define AD1848_HW_DETECT 0x0000 /* let AD1848 driver detect chip */ | ||
121 | #define AD1848_HW_AD1847 0x0001 /* AD1847 chip */ | ||
122 | #define AD1848_HW_AD1848 0x0002 /* AD1848 chip */ | ||
123 | #define AD1848_HW_CS4248 0x0003 /* CS4248 chip */ | ||
124 | #define AD1848_HW_CMI8330 0x0004 /* CMI8330 chip */ | ||
125 | #define AD1848_HW_THINKPAD 0x0005 /* Thinkpad 360/750/755 */ | ||
126 | |||
127 | /* IBM Thinkpad specific stuff */ | 109 | /* IBM Thinkpad specific stuff */ |
128 | #define AD1848_THINKPAD_CTL_PORT1 0x15e8 | 110 | #define AD1848_THINKPAD_CTL_PORT1 0x15e8 |
129 | #define AD1848_THINKPAD_CTL_PORT2 0x15e9 | 111 | #define AD1848_THINKPAD_CTL_PORT2 0x15e9 |
@@ -167,26 +149,12 @@ struct ad1848_mix_elem { | |||
167 | .type = AD1848_MIX_SINGLE, \ | 149 | .type = AD1848_MIX_SINGLE, \ |
168 | .private_value = AD1848_MIXVAL_SINGLE(reg, shift, mask, invert) } | 150 | .private_value = AD1848_MIXVAL_SINGLE(reg, shift, mask, invert) } |
169 | 151 | ||
170 | #define AD1848_SINGLE_TLV(xname, xindex, reg, shift, mask, invert, xtlv) \ | ||
171 | { .name = xname, \ | ||
172 | .index = xindex, \ | ||
173 | .type = AD1848_MIX_SINGLE, \ | ||
174 | .private_value = AD1848_MIXVAL_SINGLE(reg, shift, mask, invert), \ | ||
175 | .tlv = xtlv } | ||
176 | |||
177 | #define AD1848_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \ | 152 | #define AD1848_DOUBLE(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \ |
178 | { .name = xname, \ | 153 | { .name = xname, \ |
179 | .index = xindex, \ | 154 | .index = xindex, \ |
180 | .type = AD1848_MIX_DOUBLE, \ | 155 | .type = AD1848_MIX_DOUBLE, \ |
181 | .private_value = AD1848_MIXVAL_DOUBLE(left_reg, right_reg, shift_left, shift_right, mask, invert) } | 156 | .private_value = AD1848_MIXVAL_DOUBLE(left_reg, right_reg, shift_left, shift_right, mask, invert) } |
182 | 157 | ||
183 | #define AD1848_DOUBLE_TLV(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert, xtlv) \ | ||
184 | { .name = xname, \ | ||
185 | .index = xindex, \ | ||
186 | .type = AD1848_MIX_DOUBLE, \ | ||
187 | .private_value = AD1848_MIXVAL_DOUBLE(left_reg, right_reg, shift_left, shift_right, mask, invert), \ | ||
188 | .tlv = xtlv } | ||
189 | |||
190 | int snd_ad1848_add_ctl_elem(struct snd_wss *chip, | 158 | int snd_ad1848_add_ctl_elem(struct snd_wss *chip, |
191 | const struct ad1848_mix_elem *c); | 159 | const struct ad1848_mix_elem *c); |
192 | 160 | ||
diff --git a/include/sound/wss.h b/include/sound/wss.h index 1e0dc77f0d25..2cc1f1462d8e 100644 --- a/include/sound/wss.h +++ b/include/sound/wss.h | |||
@@ -55,6 +55,12 @@ | |||
55 | #define WSS_HW_CS4237B 0x0402 /* CS4237B - SRS 3D */ | 55 | #define WSS_HW_CS4237B 0x0402 /* CS4237B - SRS 3D */ |
56 | #define WSS_HW_CS4238B 0x0403 /* CS4238B - QSOUND 3D */ | 56 | #define WSS_HW_CS4238B 0x0403 /* CS4238B - QSOUND 3D */ |
57 | #define WSS_HW_CS4239 0x0404 /* CS4239 - Crystal Clear (tm) stereo enhancement */ | 57 | #define WSS_HW_CS4239 0x0404 /* CS4239 - Crystal Clear (tm) stereo enhancement */ |
58 | #define WSS_HW_AD1848_MASK 0x0800 /* AD1848 serie (half duplex) */ | ||
59 | #define WSS_HW_AD1847 0x0801 /* AD1847 chip */ | ||
60 | #define WSS_HW_AD1848 0x0802 /* AD1848 chip */ | ||
61 | #define WSS_HW_CS4248 0x0803 /* CS4248 chip */ | ||
62 | #define WSS_HW_CMI8330 0x0804 /* CMI8330 chip */ | ||
63 | #define WSS_HW_THINKPAD 0x0805 /* Thinkpad 360/750/755 */ | ||
58 | /* compatible, but clones */ | 64 | /* compatible, but clones */ |
59 | #define WSS_HW_INTERWAVE 0x1000 /* InterWave chip */ | 65 | #define WSS_HW_INTERWAVE 0x1000 /* InterWave chip */ |
60 | #define WSS_HW_OPL3SA2 0x1101 /* OPL3-SA2 chip, similar to cs4231 */ | 66 | #define WSS_HW_OPL3SA2 0x1101 /* OPL3-SA2 chip, similar to cs4231 */ |
diff --git a/sound/isa/ad1848/ad1848.c b/sound/isa/ad1848/ad1848.c index 74db24ae6509..40de24b280d3 100644 --- a/sound/isa/ad1848/ad1848.c +++ b/sound/isa/ad1848/ad1848.c | |||
@@ -96,7 +96,7 @@ static int __devinit snd_ad1848_probe(struct device *dev, unsigned int n) | |||
96 | return -EINVAL; | 96 | return -EINVAL; |
97 | 97 | ||
98 | error = snd_ad1848_create(card, port[n], irq[n], dma1[n], | 98 | error = snd_ad1848_create(card, port[n], irq[n], dma1[n], |
99 | thinkpad[n] ? AD1848_HW_THINKPAD : AD1848_HW_DETECT, &chip); | 99 | thinkpad[n] ? WSS_HW_THINKPAD : WSS_HW_DETECT, &chip); |
100 | if (error < 0) | 100 | if (error < 0) |
101 | goto out; | 101 | goto out; |
102 | 102 | ||
diff --git a/sound/isa/ad1848/ad1848_lib.c b/sound/isa/ad1848/ad1848_lib.c index e25fadffdb55..5aa8f6dae75b 100644 --- a/sound/isa/ad1848/ad1848_lib.c +++ b/sound/isa/ad1848/ad1848_lib.c | |||
@@ -283,14 +283,12 @@ static int snd_ad1848_trigger(struct snd_wss *chip, unsigned char what, | |||
283 | return 0; | 283 | return 0; |
284 | } | 284 | } |
285 | snd_ad1848_out(chip, AD1848_IFACE_CTRL, chip->image[AD1848_IFACE_CTRL] |= what); | 285 | snd_ad1848_out(chip, AD1848_IFACE_CTRL, chip->image[AD1848_IFACE_CTRL] |= what); |
286 | chip->mode |= AD1848_MODE_RUNNING; | ||
287 | } else if (cmd == SNDRV_PCM_TRIGGER_STOP) { | 286 | } else if (cmd == SNDRV_PCM_TRIGGER_STOP) { |
288 | if (!(chip->image[AD1848_IFACE_CTRL] & what)) { | 287 | if (!(chip->image[AD1848_IFACE_CTRL] & what)) { |
289 | spin_unlock(&chip->reg_lock); | 288 | spin_unlock(&chip->reg_lock); |
290 | return 0; | 289 | return 0; |
291 | } | 290 | } |
292 | snd_ad1848_out(chip, AD1848_IFACE_CTRL, chip->image[AD1848_IFACE_CTRL] &= ~what); | 291 | snd_ad1848_out(chip, AD1848_IFACE_CTRL, chip->image[AD1848_IFACE_CTRL] &= ~what); |
293 | chip->mode &= ~AD1848_MODE_RUNNING; | ||
294 | } else { | 292 | } else { |
295 | result = -EINVAL; | 293 | result = -EINVAL; |
296 | } | 294 | } |
@@ -378,7 +376,7 @@ static int snd_ad1848_open(struct snd_wss *chip, unsigned int mode) | |||
378 | { | 376 | { |
379 | unsigned long flags; | 377 | unsigned long flags; |
380 | 378 | ||
381 | if (chip->mode & AD1848_MODE_OPEN) | 379 | if (chip->mode & WSS_MODE_OPEN) |
382 | return -EAGAIN; | 380 | return -EAGAIN; |
383 | 381 | ||
384 | snd_ad1848_mce_down(chip); | 382 | snd_ad1848_mce_down(chip); |
@@ -570,11 +568,9 @@ static irqreturn_t snd_ad1848_interrupt(int irq, void *dev_id) | |||
570 | { | 568 | { |
571 | struct snd_wss *chip = dev_id; | 569 | struct snd_wss *chip = dev_id; |
572 | 570 | ||
573 | if ((chip->mode & AD1848_MODE_PLAY) && chip->playback_substream && | 571 | if ((chip->mode & WSS_MODE_PLAY) && chip->playback_substream) |
574 | (chip->mode & AD1848_MODE_RUNNING)) | ||
575 | snd_pcm_period_elapsed(chip->playback_substream); | 572 | snd_pcm_period_elapsed(chip->playback_substream); |
576 | if ((chip->mode & AD1848_MODE_CAPTURE) && chip->capture_substream && | 573 | if ((chip->mode & WSS_MODE_RECORD) && chip->capture_substream) |
577 | (chip->mode & AD1848_MODE_RUNNING)) | ||
578 | snd_pcm_period_elapsed(chip->capture_substream); | 574 | snd_pcm_period_elapsed(chip->capture_substream); |
579 | outb(0, AD1848P(chip, STATUS)); /* clear global interrupt bit */ | 575 | outb(0, AD1848P(chip, STATUS)); /* clear global interrupt bit */ |
580 | return IRQ_HANDLED; | 576 | return IRQ_HANDLED; |
@@ -690,19 +686,19 @@ static int snd_ad1848_probe(struct snd_wss *chip) | |||
690 | } | 686 | } |
691 | if (id != 1) | 687 | if (id != 1) |
692 | return -ENODEV; /* no valid device found */ | 688 | return -ENODEV; /* no valid device found */ |
693 | if (chip->hardware == AD1848_HW_DETECT) { | 689 | if (chip->hardware == WSS_HW_DETECT) { |
694 | if (ad1847) { | 690 | if (ad1847) { |
695 | chip->hardware = AD1848_HW_AD1847; | 691 | chip->hardware = WSS_HW_AD1847; |
696 | } else { | 692 | } else { |
697 | chip->hardware = AD1848_HW_AD1848; | 693 | chip->hardware = WSS_HW_AD1848; |
698 | rev = snd_ad1848_in(chip, AD1848_MISC_INFO); | 694 | rev = snd_ad1848_in(chip, AD1848_MISC_INFO); |
699 | if (rev & 0x80) { | 695 | if (rev & 0x80) { |
700 | chip->hardware = AD1848_HW_CS4248; | 696 | chip->hardware = WSS_HW_CS4248; |
701 | } else if ((rev & 0x0f) == 0x0a) { | 697 | } else if ((rev & 0x0f) == 0x0a) { |
702 | snd_ad1848_out(chip, AD1848_MISC_INFO, 0x40); | 698 | snd_ad1848_out(chip, AD1848_MISC_INFO, 0x40); |
703 | for (i = 0; i < 16; ++i) { | 699 | for (i = 0; i < 16; ++i) { |
704 | if (snd_ad1848_in(chip, i) != snd_ad1848_in(chip, i + 16)) { | 700 | if (snd_ad1848_in(chip, i) != snd_ad1848_in(chip, i + 16)) { |
705 | chip->hardware = AD1848_HW_CMI8330; | 701 | chip->hardware = WSS_HW_CMI8330; |
706 | break; | 702 | break; |
707 | } | 703 | } |
708 | } | 704 | } |
@@ -782,7 +778,8 @@ static int snd_ad1848_playback_open(struct snd_pcm_substream *substream) | |||
782 | struct snd_pcm_runtime *runtime = substream->runtime; | 778 | struct snd_pcm_runtime *runtime = substream->runtime; |
783 | int err; | 779 | int err; |
784 | 780 | ||
785 | if ((err = snd_ad1848_open(chip, AD1848_MODE_PLAY)) < 0) | 781 | err = snd_ad1848_open(chip, WSS_MODE_PLAY); |
782 | if (err < 0) | ||
786 | return err; | 783 | return err; |
787 | chip->playback_substream = substream; | 784 | chip->playback_substream = substream; |
788 | runtime->hw = snd_ad1848_playback; | 785 | runtime->hw = snd_ad1848_playback; |
@@ -798,7 +795,8 @@ static int snd_ad1848_capture_open(struct snd_pcm_substream *substream) | |||
798 | struct snd_pcm_runtime *runtime = substream->runtime; | 795 | struct snd_pcm_runtime *runtime = substream->runtime; |
799 | int err; | 796 | int err; |
800 | 797 | ||
801 | if ((err = snd_ad1848_open(chip, AD1848_MODE_CAPTURE)) < 0) | 798 | err = snd_ad1848_open(chip, WSS_MODE_RECORD); |
799 | if (err < 0) | ||
802 | return err; | 800 | return err; |
803 | chip->capture_substream = substream; | 801 | chip->capture_substream = substream; |
804 | runtime->hw = snd_ad1848_capture; | 802 | runtime->hw = snd_ad1848_capture; |
@@ -812,7 +810,7 @@ static int snd_ad1848_playback_close(struct snd_pcm_substream *substream) | |||
812 | { | 810 | { |
813 | struct snd_wss *chip = snd_pcm_substream_chip(substream); | 811 | struct snd_wss *chip = snd_pcm_substream_chip(substream); |
814 | 812 | ||
815 | chip->mode &= ~AD1848_MODE_PLAY; | 813 | chip->mode &= ~WSS_MODE_PLAY; |
816 | chip->playback_substream = NULL; | 814 | chip->playback_substream = NULL; |
817 | snd_ad1848_close(chip); | 815 | snd_ad1848_close(chip); |
818 | return 0; | 816 | return 0; |
@@ -822,7 +820,7 @@ static int snd_ad1848_capture_close(struct snd_pcm_substream *substream) | |||
822 | { | 820 | { |
823 | struct snd_wss *chip = snd_pcm_substream_chip(substream); | 821 | struct snd_wss *chip = snd_pcm_substream_chip(substream); |
824 | 822 | ||
825 | chip->mode &= ~AD1848_MODE_CAPTURE; | 823 | chip->mode &= ~WSS_MODE_RECORD; |
826 | chip->capture_substream = NULL; | 824 | chip->capture_substream = NULL; |
827 | snd_ad1848_close(chip); | 825 | snd_ad1848_close(chip); |
828 | return 0; | 826 | return 0; |
@@ -903,9 +901,9 @@ int snd_ad1848_create(struct snd_card *card, | |||
903 | chip->dma1 = dma; | 901 | chip->dma1 = dma; |
904 | chip->dma2 = dma; | 902 | chip->dma2 = dma; |
905 | 903 | ||
906 | if (hardware == AD1848_HW_THINKPAD) { | 904 | if (hardware == WSS_HW_THINKPAD) { |
907 | chip->thinkpad_flag = 1; | 905 | chip->thinkpad_flag = 1; |
908 | chip->hardware = AD1848_HW_DETECT; /* reset */ | 906 | chip->hardware = WSS_HW_DETECT; /* reset */ |
909 | snd_ad1848_thinkpad_twiddle(chip, 1); | 907 | snd_ad1848_thinkpad_twiddle(chip, 1); |
910 | } | 908 | } |
911 | 909 | ||
@@ -1214,6 +1212,20 @@ static const DECLARE_TLV_DB_SCALE(db_scale_6bit, -9450, 150, 0); | |||
1214 | static const DECLARE_TLV_DB_SCALE(db_scale_5bit_12db_max, -3450, 150, 0); | 1212 | static const DECLARE_TLV_DB_SCALE(db_scale_5bit_12db_max, -3450, 150, 0); |
1215 | static const DECLARE_TLV_DB_SCALE(db_scale_rec_gain, 0, 150, 0); | 1213 | static const DECLARE_TLV_DB_SCALE(db_scale_rec_gain, 0, 150, 0); |
1216 | 1214 | ||
1215 | #define AD1848_SINGLE_TLV(xname, xindex, reg, shift, mask, invert, xtlv) \ | ||
1216 | { .name = xname, \ | ||
1217 | .index = xindex, \ | ||
1218 | .type = AD1848_MIX_SINGLE, \ | ||
1219 | .private_value = AD1848_MIXVAL_SINGLE(reg, shift, mask, invert), \ | ||
1220 | .tlv = xtlv } | ||
1221 | |||
1222 | #define AD1848_DOUBLE_TLV(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert, xtlv) \ | ||
1223 | { .name = xname, \ | ||
1224 | .index = xindex, \ | ||
1225 | .type = AD1848_MIX_DOUBLE, \ | ||
1226 | .private_value = AD1848_MIXVAL_DOUBLE(left_reg, right_reg, shift_left, shift_right, mask, invert), \ | ||
1227 | .tlv = xtlv } | ||
1228 | |||
1217 | static struct ad1848_mix_elem snd_ad1848_controls[] = { | 1229 | static struct ad1848_mix_elem snd_ad1848_controls[] = { |
1218 | AD1848_DOUBLE("PCM Playback Switch", 0, AD1848_LEFT_OUTPUT, AD1848_RIGHT_OUTPUT, 7, 7, 1, 1), | 1230 | AD1848_DOUBLE("PCM Playback Switch", 0, AD1848_LEFT_OUTPUT, AD1848_RIGHT_OUTPUT, 7, 7, 1, 1), |
1219 | AD1848_DOUBLE_TLV("PCM Playback Volume", 0, AD1848_LEFT_OUTPUT, AD1848_RIGHT_OUTPUT, 0, 0, 63, 1, | 1231 | AD1848_DOUBLE_TLV("PCM Playback Volume", 0, AD1848_LEFT_OUTPUT, AD1848_RIGHT_OUTPUT, 0, 0, 63, 1, |
diff --git a/sound/isa/cmi8330.c b/sound/isa/cmi8330.c index aefd2f4a0572..af6ba129910e 100644 --- a/sound/isa/cmi8330.c +++ b/sound/isa/cmi8330.c | |||
@@ -465,12 +465,12 @@ static int __devinit snd_cmi8330_probe(struct snd_card *card, int dev) | |||
465 | wssport[dev] + 4, | 465 | wssport[dev] + 4, |
466 | wssirq[dev], | 466 | wssirq[dev], |
467 | wssdma[dev], | 467 | wssdma[dev], |
468 | AD1848_HW_DETECT, | 468 | WSS_HW_DETECT, |
469 | &acard->wss)) < 0) { | 469 | &acard->wss)) < 0) { |
470 | snd_printk(KERN_ERR PFX "(AD1848) device busy??\n"); | 470 | snd_printk(KERN_ERR PFX "(AD1848) device busy??\n"); |
471 | return err; | 471 | return err; |
472 | } | 472 | } |
473 | if (acard->wss->hardware != AD1848_HW_CMI8330) { | 473 | if (acard->wss->hardware != WSS_HW_CMI8330) { |
474 | snd_printk(KERN_ERR PFX "(AD1848) not found during probe\n"); | 474 | snd_printk(KERN_ERR PFX "(AD1848) not found during probe\n"); |
475 | return -ENODEV; | 475 | return -ENODEV; |
476 | } | 476 | } |
diff --git a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c index ff9baf751b22..1f6d6fcd6e57 100644 --- a/sound/isa/opti9xx/opti92x-ad1848.c +++ b/sound/isa/opti9xx/opti92x-ad1848.c | |||
@@ -775,7 +775,7 @@ static int __devinit snd_opti9xx_probe(struct snd_card *card) | |||
775 | #else | 775 | #else |
776 | if ((error = snd_ad1848_create(card, chip->wss_base + 4, | 776 | if ((error = snd_ad1848_create(card, chip->wss_base + 4, |
777 | chip->irq, chip->dma1, | 777 | chip->irq, chip->dma1, |
778 | AD1848_HW_DETECT, &codec)) < 0) | 778 | WSS_HW_DETECT, &codec)) < 0) |
779 | return error; | 779 | return error; |
780 | if ((error = snd_ad1848_pcm(codec, 0, &pcm)) < 0) | 780 | if ((error = snd_ad1848_pcm(codec, 0, &pcm)) < 0) |
781 | return error; | 781 | return error; |
diff --git a/sound/isa/sc6000.c b/sound/isa/sc6000.c index 1771f15d6d3c..0b6cf472ddcb 100644 --- a/sound/isa/sc6000.c +++ b/sound/isa/sc6000.c | |||
@@ -549,7 +549,7 @@ static int __devinit snd_sc6000_probe(struct device *devptr, unsigned int dev) | |||
549 | goto err_unmap2; | 549 | goto err_unmap2; |
550 | 550 | ||
551 | err = snd_ad1848_create(card, mss_port[dev] + 4, xirq, xdma, | 551 | err = snd_ad1848_create(card, mss_port[dev] + 4, xirq, xdma, |
552 | AD1848_HW_DETECT, &chip); | 552 | WSS_HW_DETECT, &chip); |
553 | if (err < 0) | 553 | if (err < 0) |
554 | goto err_unmap2; | 554 | goto err_unmap2; |
555 | card->private_data = chip; | 555 | card->private_data = chip; |
diff --git a/sound/isa/sgalaxy.c b/sound/isa/sgalaxy.c index 879c00c566ba..9a5a7cc0e607 100644 --- a/sound/isa/sgalaxy.c +++ b/sound/isa/sgalaxy.c | |||
@@ -265,7 +265,7 @@ static int __devinit snd_sgalaxy_probe(struct device *devptr, unsigned int dev) | |||
265 | 265 | ||
266 | if ((err = snd_ad1848_create(card, wssport[dev] + 4, | 266 | if ((err = snd_ad1848_create(card, wssport[dev] + 4, |
267 | xirq, xdma1, | 267 | xirq, xdma1, |
268 | AD1848_HW_DETECT, &chip)) < 0) | 268 | WSS_HW_DETECT, &chip)) < 0) |
269 | goto _err; | 269 | goto _err; |
270 | card->private_data = chip; | 270 | card->private_data = chip; |
271 | 271 | ||