Date: | 2013-04-23 21:49:58 (10 years 1 month ago) |
---|---|
Author: | Lars C. |
Commit: | b6d180b87fbaabb5f78ed9105895a4589ea44380 |
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 */ |
... | ... | |
442 | 470 | &qi_lb60_pwm_beeper, |
443 | 471 | &qi_lb60_charger_device, |
444 | 472 | &qi_lb60_audio_device, |
473 | &qi_lb60_mmc_regulator_device, | |
445 | 474 | }; |
446 | 475 | |
447 | 476 | static void __init board_gpio_setup(void) |
drivers/mmc/host/jz4740_mmc.c | ||
---|---|---|
634 | 634 | switch (ios->power_mode) { |
635 | 635 | case MMC_POWER_UP: |
636 | 636 | jz4740_mmc_reset(host); |
637 | if (gpio_is_valid(host->pdata->gpio_power)) | |
638 | gpio_set_value(host->pdata->gpio_power, | |
639 | !host->pdata->power_active_low); | |
637 | mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, ios->vdd); | |
640 | 638 | host->cmdat |= JZ_MMC_CMDAT_INIT; |
641 | 639 | clk_prepare_enable(host->clk); |
642 | 640 | break; |
643 | 641 | case MMC_POWER_ON: |
644 | 642 | break; |
645 | 643 | default: |
646 | if (gpio_is_valid(host->pdata->gpio_power)) | |
647 | gpio_set_value(host->pdata->gpio_power, | |
648 | host->pdata->power_active_low); | |
644 | mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, 0); | |
649 | 645 | clk_disable_unprepare(host->clk); |
650 | 646 | break; |
651 | 647 | } |
... | ... | |
739 | 735 | JZ_GPIO_BULK_PIN(MSC_DATA3), |
740 | 736 | }; |
741 | 737 | |
742 | static int jz4740_mmc_request_gpio(struct device *dev, int gpio, | |
743 | const char *name, bool output, int value) | |
744 | { | |
745 | int ret; | |
746 | ||
747 | if (!gpio_is_valid(gpio)) | |
748 | return 0; | |
749 | ||
750 | ret = gpio_request(gpio, name); | |
751 | if (ret) { | |
752 | dev_err(dev, "Failed to request %s gpio: %d\n", name, ret); | |
753 | return ret; | |
754 | } | |
755 | ||
756 | if (output) | |
757 | gpio_direction_output(gpio, value); | |
758 | else | |
759 | gpio_direction_input(gpio); | |
760 | ||
761 | return 0; | |
762 | } | |
763 | ||
764 | 738 | static int jz4740_mmc_request_gpios(struct mmc_host *mmc, |
765 | 739 | struct platform_device *pdev) |
766 | 740 | { |
... | ... | |
781 | 755 | return ret; |
782 | 756 | } |
783 | 757 | |
784 | if (gpio_is_valid(pdata->gpio_read_only)) { | |
758 | if (gpio_is_valid(pdata->gpio_read_only)) | |
785 | 759 | ret = mmc_gpio_request_ro(mmc, pdata->gpio_read_only); |
786 | if (ret) | |
787 | return ret; | |
788 | } | |
789 | ||
790 | return jz4740_mmc_request_gpio(&pdev->dev, pdata->gpio_power, | |
791 | "MMC read only", true, pdata->power_active_low); | |
792 | } | |
793 | ||
794 | static void jz4740_mmc_free_gpios(struct platform_device *pdev) | |
795 | { | |
796 | struct jz4740_mmc_platform_data *pdata = pdev->dev.platform_data; | |
797 | ||
798 | if (!pdata) | |
799 | return; | |
800 | 760 | |
801 | if (gpio_is_valid(pdata->gpio_power)) | |
802 | gpio_free(pdata->gpio_power); | |
761 | return ret; | |
803 | 762 | } |
804 | 763 | |
805 | 764 | static inline size_t jz4740_mmc_num_pins(struct jz4740_mmc_host *host) |
... | ... | |
869 | 828 | if (ret) |
870 | 829 | goto err_gpio_bulk_free; |
871 | 830 | |
831 | ret = mmc_regulator_get_supply(mmc); | |
832 | if (ret) | |
833 | goto err_gpio_bulk_free; | |
834 | ||
872 | 835 | mmc->ops = &jz4740_mmc_ops; |
873 | 836 | mmc->f_min = JZ_MMC_CLK_RATE / 128; |
874 | 837 | mmc->f_max = JZ_MMC_CLK_RATE; |
875 | mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; | |
876 | 838 | mmc->caps = (pdata && pdata->data_1bit) ? 0 : MMC_CAP_4_BIT_DATA; |
877 | 839 | mmc->caps |= MMC_CAP_SDIO_IRQ; |
878 | 840 | |
... | ... | |
892 | 854 | dev_name(&pdev->dev), host); |
893 | 855 | if (ret) { |
894 | 856 | dev_err(&pdev->dev, "Failed to request irq: %d\n", ret); |
895 | goto err_free_gpios; | |
857 | goto err_gpio_bulk_free; | |
896 | 858 | } |
897 | 859 | |
898 | 860 | jz4740_mmc_reset(host); |
... | ... | |
915 | 877 | |
916 | 878 | err_free_irq: |
917 | 879 | free_irq(host->irq, host); |
918 | err_free_gpios: | |
919 | jz4740_mmc_free_gpios(pdev); | |
920 | 880 | err_gpio_bulk_free: |
921 | 881 | jz_gpio_bulk_free(jz4740_mmc_pins, jz4740_mmc_num_pins(host)); |
922 | 882 | err_cpufreq_unreg: |
... | ... | |
939 | 899 | |
940 | 900 | free_irq(host->irq, host); |
941 | 901 | |
942 | jz4740_mmc_free_gpios(pdev); | |
943 | 902 | jz_gpio_bulk_free(jz4740_mmc_pins, jz4740_mmc_num_pins(host)); |
944 | 903 | |
945 | 904 | 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