Date: | 2013-04-23 21:49:58 (10 years 11 months ago) |
---|---|
Author: | Lars C. |
Commit: | 1be551a8eb58178b009ac645c537deb68ada70f9 |
Message: | mmc: jz4740: Use a regulator for power control |
Files: |
arch/mips/include/asm/mach-jz4740/jz4740_mmc.h (1 diff) arch/mips/jz4740/board-a320.c (2 diffs) arch/mips/jz4740/board-qi_lb60.c (2 diffs) drivers/mmc/host/jz4740_mmc.c (7 diffs) |
Change Details
arch/mips/include/asm/mach-jz4740/jz4740_mmc.h | ||
---|---|---|
2 | 2 | #define __LINUX_MMC_JZ4740_MMC |
3 | 3 | |
4 | 4 | struct jz4740_mmc_platform_data { |
5 | int gpio_power; | |
6 | 5 | int gpio_card_detect; |
7 | 6 | int gpio_read_only; |
8 | 7 | unsigned card_detect_active_low:1; |
9 | 8 | unsigned read_only_active_low:1; |
10 | unsigned power_active_low:1; | |
11 | 9 | |
12 | 10 | unsigned data_1bit:1; |
13 | 11 | }; |
arch/mips/jz4740/board-a320.c | ||
---|---|---|
207 | 207 | PWM_LOOKUP("jz4740-pwm", 7, "pwm-backlight", 0), |
208 | 208 | }; |
209 | 209 | |
210 | static struct regulator_consumer_supply a320_mmc_regulator_consumer = | |
211 | REGULATOR_SUPPLY("vmmc", "jz4740-mmc.0"); | |
212 | ||
213 | static struct regulator_init_data a320_mmc_regulator_init_data = { | |
214 | .num_consumer_supplies = 1, | |
215 | .consumer_supplies = &a320_mmc_regulator_consumer, | |
216 | .constraints = { | |
217 | .name = "MMC power", | |
218 | .min_uV = 3300000, | |
219 | .max_uV = 3300000, | |
220 | .valid_modes_mask = REGULATOR_MODE_NORMAL, | |
221 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | |
222 | }, | |
223 | }; | |
224 | ||
225 | static struct fixed_voltage_config a320_mmc_regulator_data = { | |
226 | .supply_name = "MMC power", | |
227 | .microvolts = 3300000, | |
228 | .init_data = &a320_mmc_regulator_init_data, | |
229 | }; | |
230 | ||
231 | static struct platform_device a320_mmc_regulator_device = { | |
232 | .name = "reg-fixed-voltage", | |
233 | .id = -1, | |
234 | .dev = { | |
235 | .platform_data = &a320_mmc_regulator_data, | |
236 | } | |
237 | }; | |
238 | ||
210 | 239 | static struct jz4740_mmc_platform_data a320_mmc_pdata = { |
211 | 240 | .gpio_card_detect = JZ_GPIO_PORTB(29), |
212 | 241 | .gpio_read_only = -1, |
213 | .gpio_power = -1, | |
214 | // TODO(MtH): I don't know which GPIO pin the SD power is connected to. | |
215 | // Booboo left power alone, but I don't know why. | |
216 | //.gpio_power = GPIO_SD_VCC_EN_N, | |
217 | //.power_active_low = 1, | |
218 | 242 | }; |
219 | 243 | |
220 | 244 | /* Battery */ |
... | ... | |
381 | 405 | &a320_backlight_device, |
382 | 406 | &a320_gpio_keys_device, |
383 | 407 | &a320_audio_device, |
408 | &a320_mmc_regulator_device, | |
384 | 409 | }; |
385 | 410 | |
386 | 411 | static void __init board_gpio_setup(void) |
arch/mips/jz4740/board-qi_lb60.c | ||
---|---|---|
350 | 350 | } |
351 | 351 | }; |
352 | 352 | |
353 | static struct regulator_consumer_supply qi_lb60_mmc_regulator_consumer = | |
354 | REGULATOR_SUPPLY("vmmc", "jz4740-mmc.0"); | |
355 | ||
356 | static struct regulator_init_data qi_lb60_mmc_regulator_init_data = { | |
357 | .num_consumer_supplies = 1, | |
358 | .consumer_supplies = &qi_lb60_mmc_regulator_consumer, | |
359 | .constraints = { | |
360 | .name = "MMC power", | |
361 | .min_uV = 3300000, | |
362 | .max_uV = 3300000, | |
363 | .valid_modes_mask = REGULATOR_MODE_NORMAL, | |
364 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | |
365 | }, | |
366 | }; | |
367 | ||
368 | static struct fixed_voltage_config qi_lb60_mmc_regulator_data = { | |
369 | .supply_name = "MMC power", | |
370 | .microvolts = 3300000, | |
371 | .gpio = QI_LB60_GPIO_SD_VCC_EN_N, | |
372 | .init_data = &qi_lb60_mmc_regulator_init_data, | |
373 | }; | |
374 | ||
375 | static struct platform_device qi_lb60_mmc_regulator_device = { | |
376 | .name = "reg-fixed-voltage", | |
377 | .id = -1, | |
378 | .dev = { | |
379 | .platform_data = &qi_lb60_mmc_regulator_data, | |
380 | } | |
381 | }; | |
382 | ||
353 | 383 | static struct jz4740_mmc_platform_data qi_lb60_mmc_pdata = { |
354 | 384 | .gpio_card_detect = QI_LB60_GPIO_SD_CD, |
355 | 385 | .gpio_read_only = -1, |
356 | .gpio_power = QI_LB60_GPIO_SD_VCC_EN_N, | |
357 | .power_active_low = 1, | |
358 | 386 | }; |
359 | 387 | |
360 | 388 | /* OHCI */ |
... | ... | |
443 | 471 | &qi_lb60_pwm_beeper, |
444 | 472 | &qi_lb60_charger_device, |
445 | 473 | &qi_lb60_audio_device, |
474 | &qi_lb60_mmc_regulator_device, | |
446 | 475 | }; |
447 | 476 | |
448 | 477 | static void __init board_gpio_setup(void) |
drivers/mmc/host/jz4740_mmc.c | ||
---|---|---|
626 | 626 | switch (ios->power_mode) { |
627 | 627 | case MMC_POWER_UP: |
628 | 628 | jz4740_mmc_reset(host); |
629 | if (gpio_is_valid(host->pdata->gpio_power)) | |
630 | gpio_set_value(host->pdata->gpio_power, | |
631 | !host->pdata->power_active_low); | |
629 | mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, ios->vdd); | |
632 | 630 | host->cmdat |= JZ_MMC_CMDAT_INIT; |
633 | 631 | clk_prepare_enable(host->clk); |
634 | 632 | break; |
635 | 633 | case MMC_POWER_ON: |
636 | 634 | break; |
637 | 635 | default: |
638 | if (gpio_is_valid(host->pdata->gpio_power)) | |
639 | gpio_set_value(host->pdata->gpio_power, | |
640 | host->pdata->power_active_low); | |
636 | mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0); | |
641 | 637 | clk_disable_unprepare(host->clk); |
642 | 638 | break; |
643 | 639 | } |
... | ... | |
731 | 727 | JZ_GPIO_BULK_PIN(MSC_DATA3), |
732 | 728 | }; |
733 | 729 | |
734 | static int jz4740_mmc_request_gpio(struct device *dev, int gpio, | |
735 | const char *name, bool output, int value) | |
736 | { | |
737 | int ret; | |
738 | ||
739 | if (!gpio_is_valid(gpio)) | |
740 | return 0; | |
741 | ||
742 | ret = gpio_request(gpio, name); | |
743 | if (ret) { | |
744 | dev_err(dev, "Failed to request %s gpio: %d\n", name, ret); | |
745 | return ret; | |
746 | } | |
747 | ||
748 | if (output) | |
749 | gpio_direction_output(gpio, value); | |
750 | else | |
751 | gpio_direction_input(gpio); | |
752 | ||
753 | return 0; | |
754 | } | |
755 | ||
756 | 730 | static int jz4740_mmc_request_gpios(struct mmc_host *mmc, |
757 | 731 | struct platform_device *pdev) |
758 | 732 | { |
... | ... | |
773 | 747 | return ret; |
774 | 748 | } |
775 | 749 | |
776 | if (gpio_is_valid(pdata->gpio_read_only)) { | |
750 | if (gpio_is_valid(pdata->gpio_read_only)) | |
777 | 751 | ret = mmc_gpio_request_ro(mmc, pdata->gpio_read_only); |
778 | if (ret) | |
779 | return ret; | |
780 | } | |
781 | ||
782 | return jz4740_mmc_request_gpio(&pdev->dev, pdata->gpio_power, | |
783 | "MMC read only", true, pdata->power_active_low); | |
784 | } | |
785 | ||
786 | static void jz4740_mmc_free_gpios(struct platform_device *pdev) | |
787 | { | |
788 | struct jz4740_mmc_platform_data *pdata = pdev->dev.platform_data; | |
789 | ||
790 | if (!pdata) | |
791 | return; | |
792 | 752 | |
793 | if (gpio_is_valid(pdata->gpio_power)) | |
794 | gpio_free(pdata->gpio_power); | |
753 | return ret; | |
795 | 754 | } |
796 | 755 | |
797 | 756 | static inline size_t jz4740_mmc_num_pins(struct jz4740_mmc_host *host) |
... | ... | |
861 | 820 | if (ret) |
862 | 821 | goto err_gpio_bulk_free; |
863 | 822 | |
823 | ret = mmc_regulator_get_supply(mmc); | |
824 | if (ret) | |
825 | goto err_gpio_bulk_free; | |
826 | ||
864 | 827 | mmc->ops = &jz4740_mmc_ops; |
865 | 828 | mmc->f_min = JZ_MMC_CLK_RATE / 128; |
866 | 829 | mmc->f_max = JZ_MMC_CLK_RATE; |
867 | mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; | |
868 | 830 | mmc->caps = (pdata && pdata->data_1bit) ? 0 : MMC_CAP_4_BIT_DATA; |
869 | 831 | mmc->caps |= MMC_CAP_SDIO_IRQ; |
870 | 832 | |
... | ... | |
884 | 846 | dev_name(&pdev->dev), host); |
885 | 847 | if (ret) { |
886 | 848 | dev_err(&pdev->dev, "Failed to request irq: %d\n", ret); |
887 | goto err_free_gpios; | |
849 | goto err_gpio_bulk_free; | |
888 | 850 | } |
889 | 851 | |
890 | 852 | jz4740_mmc_reset(host); |
... | ... | |
907 | 869 | |
908 | 870 | err_free_irq: |
909 | 871 | free_irq(host->irq, host); |
910 | err_free_gpios: | |
911 | jz4740_mmc_free_gpios(pdev); | |
912 | 872 | err_gpio_bulk_free: |
913 | 873 | jz_gpio_bulk_free(jz4740_mmc_pins, jz4740_mmc_num_pins(host)); |
914 | 874 | err_cpufreq_unreg: |
... | ... | |
931 | 891 | |
932 | 892 | free_irq(host->irq, host); |
933 | 893 | |
934 | jz4740_mmc_free_gpios(pdev); | |
935 | 894 | jz_gpio_bulk_free(jz4740_mmc_pins, jz4740_mmc_num_pins(host)); |
936 | 895 | |
937 | 896 | jz4740_mmc_cpufreq_unregister(); |
Branches:
ben-wpan
ben-wpan-stefan
5396a9238205f20f811ea57898980d3ca82df0b6
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9