waterPressureDataPreprocessingThread.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /*
  2. * linux/arch/arm/mach-omap2/hsmmc.c
  3. *
  4. * Copyright (C) 2007-2008 Texas Instruments
  5. * Copyright (C) 2008 Nokia Corporation
  6. * Author: Texas Instruments
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #include <linux/kernel.h>
  13. #include <linux/slab.h>
  14. #include <linux/string.h>
  15. #include <linux/delay.h>
  16. #include <linux/gpio.h>
  17. #include <linux/platform_data/gpio-omap.h>
  18. #include "soc.h"
  19. #include "omap_device.h"
  20. #include "omap-pm.h"
  21. #include "mux.h"
  22. #include "mmc.h"
  23. #include "hsmmc.h"
  24. #include "control.h"
  25. #if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
  26. static u16 control_pbias_offset;
  27. static u16 control_devconf1_offset;
  28. static u16 control_mmc1;
  29. #define HSMMC_NAME_LEN 9
  30. #if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
  31. static int hsmmc_get_context_loss(struct device *dev)
  32. {
  33. return omap_pm_get_dev_context_loss_count(dev);
  34. }
  35. #else
  36. #define hsmmc_get_context_loss NULL
  37. #endif
  38. static void omap_hsmmc1_before_set_reg(struct device *dev, int slot,
  39. int power_on, int vdd)
  40. {
  41. u32 reg, prog_io;
  42. struct omap_mmc_platform_data *mmc = dev->platform_data;
  43. if (mmc->slots[0].remux)
  44. mmc->slots[0].remux(dev, slot, power_on);
  45. /*
  46. * Assume we power both OMAP VMMC1 (for CMD, CLK, DAT0..3) and the
  47. * card with Vcc regulator (from twl4030 or whatever). OMAP has both
  48. * 1.8V and 3.0V modes, controlled by the PBIAS register.
  49. *
  50. * In 8-bit modes, OMAP VMMC1A (for DAT4..7) needs a supply, which
  51. * is most naturally TWL VSIM; those pins also use PBIAS.
  52. *
  53. * FIXME handle VMMC1A as needed ...
  54. */
  55. if (power_on) {
  56. if (cpu_is_omap2430()) {
  57. reg = omap_ctrl_readl(OMAP243X_CONTROL_DEVCONF1);
  58. if ((1 << vdd) >= MMC_VDD_30_31)
  59. reg |= OMAP243X_MMC1_ACTIVE_OVERWRITE;
  60. else
  61. reg &= ~OMAP243X_MMC1_ACTIVE_OVERWRITE;
  62. omap_ctrl_writel(reg, OMAP243X_CONTROL_DEVCONF1);
  63. }
  64. if (mmc->slots[0].internal_clock) {
  65. reg = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
  66. reg |= OMAP2_MMCSDIO1ADPCLKISEL;
  67. omap_ctrl_writel(reg, OMAP2_CONTROL_DEVCONF0);
  68. }
  69. reg = omap_ctrl_readl(control_pbias_offset);
  70. if (cpu_is_omap3630()) {
  71. /* Set MMC I/O to 52Mhz */
  72. prog_io = omap_ctrl_readl(OMAP343X_CONTROL_PROG_IO1);
  73. prog_io |= OMAP3630_PRG_SDMMC1_SPEEDCTRL;
  74. omap_ctrl_writel(prog_io, OMAP343X_CONTROL_PROG_IO1);
  75. } else {
  76. reg |= OMAP2_PBIASSPEEDCTRL0;
  77. }
  78. reg &= ~OMAP2_PBIASLITEPWRDNZ0;
  79. omap_ctrl_writel(reg, control_pbias_offset);
  80. } else {
  81. reg = omap_ctrl_readl(control_pbias_offset);
  82. reg &= ~OMAP2_PBIASLITEPWRDNZ0;
  83. omap_ctrl_writel(reg, control_pbias_offset);
  84. }
  85. }
  86. static void omap_hsmmc1_after_set_reg(struct device *dev, int slot,
  87. int power_on, int vdd)
  88. {
  89. u32 reg;
  90. /* 100ms delay required for PBIAS configuration */
  91. msleep(100);
  92. if (power_on) {
  93. reg = omap_ctrl_readl(control_pbias_offset);
  94. reg |= (OMAP2_PBIASLITEPWRDNZ0 | OMAP2_PBIASSPEEDCTRL0);
  95. if ((1 << vdd) <= MMC_VDD_165_195)
  96. reg &= ~OMAP2_PBIASLITEVMODE0;
  97. else
  98. reg |= OMAP2_PBIASLITEVMODE0;
  99. omap_ctrl_writel(reg, control_pbias_offset);
  100. } else {
  101. reg = omap_ctrl_readl(control_pbias_offset);
  102. reg |= (OMAP2_PBIASSPEEDCTRL0 | OMAP2_PBIASLITEPWRDNZ0 |
  103. OMAP2_PBIASLITEVMODE0);
  104. omap_ctrl_writel(reg, control_pbias_offset);
  105. }
  106. }
  107. static void omap4_hsmmc1_before_set_reg(struct device *dev, int slot,
  108. int power_on, int vdd)
  109. {
  110. u32 reg;
  111. /*
  112. * Assume we power both OMAP VMMC1 (for CMD, CLK, DAT0..3) and the
  113. * card with Vcc regulator (from twl4030 or whatever). OMAP has both
  114. * 1.8V and 3.0V modes, controlled by the PBIAS register.
  115. */
  116. reg = omap4_ctrl_pad_readl(control_pbias_offset);
  117. reg &= ~(OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK |
  118. OMAP4_MMC1_PWRDNZ_MASK |
  119. OMAP4_MMC1_PBIASLITE_VMODE_MASK);
  120. omap4_ctrl_pad_writel(reg, control_pbias_offset);
  121. }