Commit 02ce600c1e485a7da4a26166b5a75b68c6013fe1
1 parent
38641a52
Convert SD cards code to use qemu_irq too.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3671 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
6 changed files
with
22 additions
and
63 deletions
hw/omap_mmc.c
@@ -25,7 +25,6 @@ struct omap_mmc_s { | @@ -25,7 +25,6 @@ struct omap_mmc_s { | ||
25 | target_phys_addr_t base; | 25 | target_phys_addr_t base; |
26 | qemu_irq irq; | 26 | qemu_irq irq; |
27 | qemu_irq *dma; | 27 | qemu_irq *dma; |
28 | - qemu_irq handler[2]; | ||
29 | omap_clk clk; | 28 | omap_clk clk; |
30 | SDState *card; | 29 | SDState *card; |
31 | uint16_t last_cmd; | 30 | uint16_t last_cmd; |
@@ -507,22 +506,6 @@ void omap_mmc_reset(struct omap_mmc_s *host) | @@ -507,22 +506,6 @@ void omap_mmc_reset(struct omap_mmc_s *host) | ||
507 | host->transfer = 0; | 506 | host->transfer = 0; |
508 | } | 507 | } |
509 | 508 | ||
510 | -static void omap_mmc_ro_cb(void *opaque, int level) | ||
511 | -{ | ||
512 | - struct omap_mmc_s *s = (struct omap_mmc_s *) opaque; | ||
513 | - | ||
514 | - if (s->handler[0]) | ||
515 | - qemu_set_irq(s->handler[0], level); | ||
516 | -} | ||
517 | - | ||
518 | -static void omap_mmc_cover_cb(void *opaque, int level) | ||
519 | -{ | ||
520 | - struct omap_mmc_s *s = (struct omap_mmc_s *) opaque; | ||
521 | - | ||
522 | - if (s->handler[1]) | ||
523 | - qemu_set_irq(s->handler[1], level); | ||
524 | -} | ||
525 | - | ||
526 | struct omap_mmc_s *omap_mmc_init(target_phys_addr_t base, | 509 | struct omap_mmc_s *omap_mmc_init(target_phys_addr_t base, |
527 | qemu_irq irq, qemu_irq dma[], omap_clk clk) | 510 | qemu_irq irq, qemu_irq dma[], omap_clk clk) |
528 | { | 511 | { |
@@ -542,13 +525,10 @@ struct omap_mmc_s *omap_mmc_init(target_phys_addr_t base, | @@ -542,13 +525,10 @@ struct omap_mmc_s *omap_mmc_init(target_phys_addr_t base, | ||
542 | /* Instantiate the storage */ | 525 | /* Instantiate the storage */ |
543 | s->card = sd_init(sd_bdrv); | 526 | s->card = sd_init(sd_bdrv); |
544 | 527 | ||
545 | - sd_set_cb(s->card, s, omap_mmc_ro_cb, omap_mmc_cover_cb); | ||
546 | - | ||
547 | return s; | 528 | return s; |
548 | } | 529 | } |
549 | 530 | ||
550 | void omap_mmc_handlers(struct omap_mmc_s *s, qemu_irq ro, qemu_irq cover) | 531 | void omap_mmc_handlers(struct omap_mmc_s *s, qemu_irq ro, qemu_irq cover) |
551 | { | 532 | { |
552 | - s->handler[0] = ro; | ||
553 | - s->handler[1] = cover; | 533 | + sd_set_cb(s->card, ro, cover); |
554 | } | 534 | } |
hw/pxa.h
@@ -96,9 +96,8 @@ void pxa2xx_lcdc_oritentation(void *opaque, int angle); | @@ -96,9 +96,8 @@ void pxa2xx_lcdc_oritentation(void *opaque, int angle); | ||
96 | struct pxa2xx_mmci_s; | 96 | struct pxa2xx_mmci_s; |
97 | struct pxa2xx_mmci_s *pxa2xx_mmci_init(target_phys_addr_t base, | 97 | struct pxa2xx_mmci_s *pxa2xx_mmci_init(target_phys_addr_t base, |
98 | qemu_irq irq, void *dma); | 98 | qemu_irq irq, void *dma); |
99 | -void pxa2xx_mmci_handlers(struct pxa2xx_mmci_s *s, void *opaque, | ||
100 | - void (*readonly_cb)(void *, int), | ||
101 | - void (*coverswitch_cb)(void *, int)); | 99 | +void pxa2xx_mmci_handlers(struct pxa2xx_mmci_s *s, qemu_irq readonly, |
100 | + qemu_irq coverswitch); | ||
102 | 101 | ||
103 | /* pxa2xx_pcmcia.c */ | 102 | /* pxa2xx_pcmcia.c */ |
104 | struct pxa2xx_pcmcia_s; | 103 | struct pxa2xx_pcmcia_s; |
hw/pxa2xx_mmci.c
@@ -545,9 +545,8 @@ struct pxa2xx_mmci_s *pxa2xx_mmci_init(target_phys_addr_t base, | @@ -545,9 +545,8 @@ struct pxa2xx_mmci_s *pxa2xx_mmci_init(target_phys_addr_t base, | ||
545 | return s; | 545 | return s; |
546 | } | 546 | } |
547 | 547 | ||
548 | -void pxa2xx_mmci_handlers(struct pxa2xx_mmci_s *s, void *opaque, | ||
549 | - void (*readonly_cb)(void *, int), | ||
550 | - void (*coverswitch_cb)(void *, int)) | 548 | +void pxa2xx_mmci_handlers(struct pxa2xx_mmci_s *s, qemu_irq readonly, |
549 | + qemu_irq coverswitch) | ||
551 | { | 550 | { |
552 | - sd_set_cb(s->card, opaque, readonly_cb, coverswitch_cb); | 551 | + sd_set_cb(s->card, read, coverswitch); |
553 | } | 552 | } |
hw/sd.c
@@ -90,9 +90,8 @@ struct SDState { | @@ -90,9 +90,8 @@ struct SDState { | ||
90 | uint32_t data_start; | 90 | uint32_t data_start; |
91 | uint32_t data_offset; | 91 | uint32_t data_offset; |
92 | uint8_t data[512]; | 92 | uint8_t data[512]; |
93 | - void (*readonly_cb)(void *, int); | ||
94 | - void (*inserted_cb)(void *, int); | ||
95 | - void *opaque; | 93 | + qemu_irq readonly_cb; |
94 | + qemu_irq inserted_cb; | ||
96 | BlockDriverState *bdrv; | 95 | BlockDriverState *bdrv; |
97 | }; | 96 | }; |
98 | 97 | ||
@@ -372,6 +371,8 @@ static void sd_reset(SDState *sd, BlockDriverState *bdrv) | @@ -372,6 +371,8 @@ static void sd_reset(SDState *sd, BlockDriverState *bdrv) | ||
372 | 371 | ||
373 | sd->bdrv = bdrv; | 372 | sd->bdrv = bdrv; |
374 | 373 | ||
374 | + if (s->wp_groups) | ||
375 | + qemu_free(s->wp_groups); | ||
375 | sd->wp_switch = bdrv_is_read_only(bdrv); | 376 | sd->wp_switch = bdrv_is_read_only(bdrv); |
376 | sd->wp_groups = (int *) qemu_mallocz(sizeof(int) * sect); | 377 | sd->wp_groups = (int *) qemu_mallocz(sizeof(int) * sect); |
377 | memset(sd->wp_groups, 0, sizeof(int) * sect); | 378 | memset(sd->wp_groups, 0, sizeof(int) * sect); |
@@ -386,12 +387,10 @@ static void sd_reset(SDState *sd, BlockDriverState *bdrv) | @@ -386,12 +387,10 @@ static void sd_reset(SDState *sd, BlockDriverState *bdrv) | ||
386 | static void sd_cardchange(void *opaque) | 387 | static void sd_cardchange(void *opaque) |
387 | { | 388 | { |
388 | SDState *sd = opaque; | 389 | SDState *sd = opaque; |
389 | - if (sd->inserted_cb) | ||
390 | - sd->inserted_cb(sd->opaque, bdrv_is_inserted(sd->bdrv)); | 390 | + qemu_set_irq(sd->inserted_cb, bdrv_is_inserted(sd->bdrv)); |
391 | if (bdrv_is_inserted(sd->bdrv)) { | 391 | if (bdrv_is_inserted(sd->bdrv)) { |
392 | sd_reset(sd, sd->bdrv); | 392 | sd_reset(sd, sd->bdrv); |
393 | - if (sd->readonly_cb) | ||
394 | - sd->readonly_cb(sd->opaque, sd->wp_switch); | 393 | + qemu_set_irq(s->readonly_cb, sd->wp_switch); |
395 | } | 394 | } |
396 | } | 395 | } |
397 | 396 | ||
@@ -401,21 +400,16 @@ SDState *sd_init(BlockDriverState *bs) | @@ -401,21 +400,16 @@ SDState *sd_init(BlockDriverState *bs) | ||
401 | 400 | ||
402 | sd = (SDState *) qemu_mallocz(sizeof(SDState)); | 401 | sd = (SDState *) qemu_mallocz(sizeof(SDState)); |
403 | sd_reset(sd, bs); | 402 | sd_reset(sd, bs); |
403 | + bdrv_set_change_cb(sd->bdrv, sd_cardchange, sd); | ||
404 | return sd; | 404 | return sd; |
405 | } | 405 | } |
406 | 406 | ||
407 | -void sd_set_cb(SDState *sd, void *opaque, | ||
408 | - void (*readonly_cb)(void *, int), | ||
409 | - void (*inserted_cb)(void *, int)) | 407 | +void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert) |
410 | { | 408 | { |
411 | - sd->opaque = opaque; | ||
412 | - sd->readonly_cb = readonly_cb; | ||
413 | - sd->inserted_cb = inserted_cb; | ||
414 | - if (sd->readonly_cb) | ||
415 | - sd->readonly_cb(sd->opaque, bdrv_is_read_only(sd->bdrv)); | ||
416 | - if (sd->inserted_cb) | ||
417 | - sd->inserted_cb(sd->opaque, bdrv_is_inserted(sd->bdrv)); | ||
418 | - bdrv_set_change_cb(sd->bdrv, sd_cardchange, sd); | 409 | + sd->readonly_cb = readonly; |
410 | + sd->inserted_cb = insert; | ||
411 | + qemu_set_irq(readonly, bdrv_is_read_only(sd->bdrv)); | ||
412 | + qemu_set_irq(insert, bdrv_is_inserted(sd->bdrv)); | ||
419 | } | 413 | } |
420 | 414 | ||
421 | static void sd_erase(SDState *sd) | 415 | static void sd_erase(SDState *sd) |
hw/sd.h
@@ -74,9 +74,7 @@ int sd_do_command(SDState *sd, struct sd_request_s *req, | @@ -74,9 +74,7 @@ int sd_do_command(SDState *sd, struct sd_request_s *req, | ||
74 | uint8_t *response); | 74 | uint8_t *response); |
75 | void sd_write_data(SDState *sd, uint8_t value); | 75 | void sd_write_data(SDState *sd, uint8_t value); |
76 | uint8_t sd_read_data(SDState *sd); | 76 | uint8_t sd_read_data(SDState *sd); |
77 | -void sd_set_cb(SDState *sd, void *opaque, | ||
78 | - void (*readonly_cb)(void *, int), | ||
79 | - void (*inserted_cb)(void *, int)); | 77 | +void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert); |
80 | int sd_data_ready(SDState *sd); | 78 | int sd_data_ready(SDState *sd); |
81 | 79 | ||
82 | #endif /* __hw_sd_h */ | 80 | #endif /* __hw_sd_h */ |
hw/spitz.c
@@ -1069,18 +1069,6 @@ static void spitz_lcd_hsync_handler(void *opaque, int line, int level) | @@ -1069,18 +1069,6 @@ static void spitz_lcd_hsync_handler(void *opaque, int line, int level) | ||
1069 | spitz_hsync ^= 1; | 1069 | spitz_hsync ^= 1; |
1070 | } | 1070 | } |
1071 | 1071 | ||
1072 | -static void spitz_mmc_coverswitch_change(void *opaque, int in) | ||
1073 | -{ | ||
1074 | - struct pxa2xx_state_s *cpu = (struct pxa2xx_state_s *) opaque; | ||
1075 | - qemu_set_irq(pxa2xx_gpio_in_get(cpu->gpio)[SPITZ_GPIO_SD_DETECT], in); | ||
1076 | -} | ||
1077 | - | ||
1078 | -static void spitz_mmc_writeprotect_change(void *opaque, int wp) | ||
1079 | -{ | ||
1080 | - struct pxa2xx_state_s *cpu = (struct pxa2xx_state_s *) opaque; | ||
1081 | - qemu_set_irq(pxa2xx_gpio_in_get(cpu->gpio)[SPITZ_GPIO_SD_WP], wp); | ||
1082 | -} | ||
1083 | - | ||
1084 | static void spitz_gpio_setup(struct pxa2xx_state_s *cpu, int slots) | 1072 | static void spitz_gpio_setup(struct pxa2xx_state_s *cpu, int slots) |
1085 | { | 1073 | { |
1086 | qemu_irq lcd_hsync; | 1074 | qemu_irq lcd_hsync; |
@@ -1096,8 +1084,9 @@ static void spitz_gpio_setup(struct pxa2xx_state_s *cpu, int slots) | @@ -1096,8 +1084,9 @@ static void spitz_gpio_setup(struct pxa2xx_state_s *cpu, int slots) | ||
1096 | pxa2xx_lcd_vsync_notifier(cpu->lcd, lcd_hsync); | 1084 | pxa2xx_lcd_vsync_notifier(cpu->lcd, lcd_hsync); |
1097 | 1085 | ||
1098 | /* MMC/SD host */ | 1086 | /* MMC/SD host */ |
1099 | - pxa2xx_mmci_handlers(cpu->mmc, cpu, spitz_mmc_writeprotect_change, | ||
1100 | - spitz_mmc_coverswitch_change); | 1087 | + pxa2xx_mmci_handlers(cpu->mmc, |
1088 | + pxa2xx_gpio_in_get(cpu->gpio)[SPITZ_GPIO_SD_WP], | ||
1089 | + pxa2xx_gpio_in_get(cpu->gpio)[SPITZ_GPIO_SD_DETECT]); | ||
1101 | 1090 | ||
1102 | /* Battery lock always closed */ | 1091 | /* Battery lock always closed */ |
1103 | qemu_irq_raise(pxa2xx_gpio_in_get(cpu->gpio)[SPITZ_GPIO_BAT_COVER]); | 1092 | qemu_irq_raise(pxa2xx_gpio_in_get(cpu->gpio)[SPITZ_GPIO_BAT_COVER]); |