Commit 1e63dca7 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'mmc-4.2-rc3' of git://git.linaro.org/people/ulf.hansson/mmc

Pull MMC fixes from Ulf Hansson:
 "Here are some mmc fixes intended for v4.2 rc4.

  Note, most of the changes are for the sdhci-esdhc-imx controller,
  which also required us to modify some related DTS files.  Those
  changes have been acked by the SoC maintainer.

  MMC core:
   - Fix a reference inbalance issue for power_ro_lock_show() sysfs handler

  MMC host:
   - omap_hsmmc: Fix IRQ errorhandling for CD, DTO, and CRC
   - sdhci: Prevent a kernel panic while using DMA
   - mtk-sd: Let it depend on HAS_DMA to prevent build errors
   - sdhci-esdhc: Make 8BIT bus work
   - sdhci-esdhc-imx: Fix some regressions for DT based platforms
   - sdhci-pxav3: Fix a regression for DT based platforms"

* tag 'mmc-4.2-rc3' of git://git.linaro.org/people/ulf.hansson/mmc:
  mmc: sdhci-pxav3: fix platform_data is not initialized
  dts: mmc: fsl-imx-esdhc: remove fsl,cd-controller support
  mmc: sdhci-esdhc-imx: clear f_max in boarddata
  mmc: sdhci-esdhc-imx: remove duplicated dts parsing
  mmc: sdhci: make max-frequency property in device tree work
  mmc: sdhci-esdhc-imx: move all non dt probe code into one function
  mmc: sdhci-esdhc-imx: fix cd regression for dt platform
  dts: imx7: fix sd card gpio polarity specified in device tree
  dts: imx25: fix sd card gpio polarity specified in device tree
  dts: imx6: fix sd card gpio polarity specified in device tree
  dts: imx53: fix sd card gpio polarity specified in device tree
  dts: imx51: fix sd card gpio polarity specified in device tree
  mmc: sdhci-esdhc: Make 8BIT bus work
  mmc: block: Add missing mmc_blk_put() in power_ro_lock_show()
  mmc: MMC_MTK should depend on HAS_DMA
  mmc: sdhci check parameters before call dma_free_coherent
  mmc: omap_hsmmc: Handle BADA, DEB and CEB interrupts
  mmc: omap_hsmmc: Fix DTO and DCRC handling
parents a52bd79e 9cd76049
...@@ -17,7 +17,6 @@ Required properties: ...@@ -17,7 +17,6 @@ Required properties:
"fsl,imx6sx-usdhc" "fsl,imx6sx-usdhc"
Optional properties: Optional properties:
- fsl,cd-controller : Indicate to use controller internal card detection
- fsl,wp-controller : Indicate to use controller internal write protection - fsl,wp-controller : Indicate to use controller internal write protection
- fsl,delay-line : Specify the number of delay cells for override mode. - fsl,delay-line : Specify the number of delay cells for override mode.
This is used to set the clock delay for DLL(Delay Line) on override mode This is used to set the clock delay for DLL(Delay Line) on override mode
...@@ -35,7 +34,6 @@ esdhc@70004000 { ...@@ -35,7 +34,6 @@ esdhc@70004000 {
compatible = "fsl,imx51-esdhc"; compatible = "fsl,imx51-esdhc";
reg = <0x70004000 0x4000>; reg = <0x70004000 0x4000>;
interrupts = <1>; interrupts = <1>;
fsl,cd-controller;
fsl,wp-controller; fsl,wp-controller;
}; };
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
*/ */
/dts-v1/; /dts-v1/;
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h> #include <dt-bindings/input/input.h>
#include "imx25.dtsi" #include "imx25.dtsi"
...@@ -114,8 +115,8 @@ &can1 { ...@@ -114,8 +115,8 @@ &can1 {
&esdhc1 { &esdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc1>; pinctrl-0 = <&pinctrl_esdhc1>;
cd-gpios = <&gpio2 1 0>; cd-gpios = <&gpio2 1 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 0 0>; wp-gpios = <&gpio2 0 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
......
...@@ -98,7 +98,7 @@ &ecspi2 { ...@@ -98,7 +98,7 @@ &ecspi2 {
&esdhc1 { &esdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc1>; pinctrl-0 = <&pinctrl_esdhc1>;
cd-gpios = <&gpio2 29 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio2 29 GPIO_ACTIVE_LOW>;
bus-width = <4>; bus-width = <4>;
status = "okay"; status = "okay";
}; };
......
...@@ -103,8 +103,8 @@ volume-down { ...@@ -103,8 +103,8 @@ volume-down {
&esdhc1 { &esdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc1>; pinctrl-0 = <&pinctrl_esdhc1>;
cd-gpios = <&gpio1 1 0>; cd-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio1 9 0>; wp-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
......
...@@ -124,8 +124,8 @@ &can2 { ...@@ -124,8 +124,8 @@ &can2 {
&esdhc1 { &esdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc1>; pinctrl-0 = <&pinctrl_esdhc1>;
cd-gpios = <&gpio1 1 0>; cd-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio1 9 0>; wp-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
......
...@@ -147,8 +147,8 @@ &ssi2 { ...@@ -147,8 +147,8 @@ &ssi2 {
&esdhc3 { &esdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc3>; pinctrl-0 = <&pinctrl_esdhc3>;
cd-gpios = <&gpio3 11 0>; cd-gpios = <&gpio3 11 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio3 12 0>; wp-gpios = <&gpio3 12 GPIO_ACTIVE_HIGH>;
bus-width = <8>; bus-width = <8>;
status = "okay"; status = "okay";
}; };
......
...@@ -41,8 +41,8 @@ volume-down { ...@@ -41,8 +41,8 @@ volume-down {
&esdhc1 { &esdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc1>; pinctrl-0 = <&pinctrl_esdhc1>;
cd-gpios = <&gpio3 13 0>; cd-gpios = <&gpio3 13 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio4 11 0>; wp-gpios = <&gpio4 11 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
......
...@@ -41,8 +41,8 @@ &esdhc2 { ...@@ -41,8 +41,8 @@ &esdhc2 {
pinctrl-0 = <&pinctrl_esdhc2>, pinctrl-0 = <&pinctrl_esdhc2>,
<&pinctrl_esdhc2_cdwp>; <&pinctrl_esdhc2_cdwp>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
wp-gpios = <&gpio1 2 0>; wp-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
cd-gpios = <&gpio1 4 0>; cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
status = "disabled"; status = "disabled";
}; };
......
...@@ -183,7 +183,7 @@ spidev1: spi@1 { ...@@ -183,7 +183,7 @@ spidev1: spi@1 {
}; };
&esdhc1 { &esdhc1 {
cd-gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio3 24 GPIO_ACTIVE_LOW>;
fsl,wp-controller; fsl,wp-controller;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc1>; pinctrl-0 = <&pinctrl_esdhc1>;
...@@ -191,7 +191,7 @@ &esdhc1 { ...@@ -191,7 +191,7 @@ &esdhc1 {
}; };
&esdhc2 { &esdhc2 {
cd-gpios = <&gpio3 25 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio3 25 GPIO_ACTIVE_LOW>;
fsl,wp-controller; fsl,wp-controller;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc2>; pinctrl-0 = <&pinctrl_esdhc2>;
......
...@@ -119,8 +119,8 @@ &audmux { ...@@ -119,8 +119,8 @@ &audmux {
&esdhc2 { &esdhc2 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_esdhc2>; pinctrl-0 = <&pinctrl_esdhc2>;
cd-gpios = <&gpio3 25 0>; cd-gpios = <&gpio3 25 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 19 0>; wp-gpios = <&gpio2 19 GPIO_ACTIVE_HIGH>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };
......
...@@ -305,8 +305,8 @@ &usbotg { ...@@ -305,8 +305,8 @@ &usbotg {
&usdhc2 { &usdhc2 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
cd-gpios = <&gpio1 4 0>; cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio1 2 0>; wp-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };
...@@ -314,8 +314,8 @@ &usdhc2 { ...@@ -314,8 +314,8 @@ &usdhc2 {
&usdhc3 { &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
cd-gpios = <&gpio7 0 0>; cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio7 1 0>; wp-gpios = <&gpio7 1 GPIO_ACTIVE_HIGH>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
*/ */
/dts-v1/; /dts-v1/;
#include <dt-bindings/gpio/gpio.h>
#include "imx6q.dtsi" #include "imx6q.dtsi"
/ { / {
...@@ -196,8 +197,8 @@ &usbotg { ...@@ -196,8 +197,8 @@ &usbotg {
}; };
&usdhc3 { &usdhc3 {
cd-gpios = <&gpio6 11 0>; cd-gpios = <&gpio6 11 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio6 14 0>; wp-gpios = <&gpio6 14 GPIO_ACTIVE_HIGH>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3 pinctrl-0 = <&pinctrl_usdhc3
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
*/ */
/dts-v1/; /dts-v1/;
#include <dt-bindings/gpio/gpio.h>
#include "imx6q.dtsi" #include "imx6q.dtsi"
/ { / {
...@@ -161,7 +162,7 @@ &usdhc3 { ...@@ -161,7 +162,7 @@ &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
bus-width = <4>; bus-width = <4>;
cd-gpios = <&gpio6 11 0>; cd-gpios = <&gpio6 11 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };
......
...@@ -251,7 +251,7 @@ &usdhc2 { ...@@ -251,7 +251,7 @@ &usdhc2 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
bus-width = <4>; bus-width = <4>;
cd-gpios = <&gpio2 2 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };
...@@ -260,7 +260,7 @@ &usdhc3 { ...@@ -260,7 +260,7 @@ &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
bus-width = <4>; bus-width = <4>;
cd-gpios = <&gpio2 0 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>; wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
......
...@@ -173,7 +173,7 @@ &usdhc1 { ...@@ -173,7 +173,7 @@ &usdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc1>; pinctrl-0 = <&pinctrl_usdhc1>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
cd-gpios = <&gpio4 7 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio4 7 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";
}; };
...@@ -181,7 +181,7 @@ &usdhc2 { ...@@ -181,7 +181,7 @@ &usdhc2 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
cd-gpios = <&gpio4 8 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio4 8 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";
}; };
......
...@@ -392,7 +392,7 @@ &usbotg { ...@@ -392,7 +392,7 @@ &usbotg {
&usdhc1 { &usdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc1>; pinctrl-0 = <&pinctrl_usdhc1>;
cd-gpios = <&gpio1 27 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio1 27 GPIO_ACTIVE_LOW>;
no-1-8-v; no-1-8-v;
status = "okay"; status = "okay";
}; };
...@@ -400,7 +400,7 @@ &usdhc1 { ...@@ -400,7 +400,7 @@ &usdhc1 {
&usdhc2 { &usdhc2 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
cd-gpios = <&gpio4 5 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio4 5 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>; wp-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>;
no-1-8-v; no-1-8-v;
status = "okay"; status = "okay";
......
...@@ -258,6 +258,6 @@ &usdhc2 { ...@@ -258,6 +258,6 @@ &usdhc2 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_cubox_i_usdhc2_aux &pinctrl_cubox_i_usdhc2>; pinctrl-0 = <&pinctrl_cubox_i_usdhc2_aux &pinctrl_cubox_i_usdhc2>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
cd-gpios = <&gpio1 4 0>; cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";
}; };
#include <dt-bindings/gpio/gpio.h>
/ { / {
regulators { regulators {
compatible = "simple-bus"; compatible = "simple-bus";
...@@ -181,7 +183,7 @@ &usbotg { ...@@ -181,7 +183,7 @@ &usbotg {
&usdhc2 { /* module slot */ &usdhc2 { /* module slot */
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
cd-gpios = <&gpio2 2 0>; cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";
}; };
......
...@@ -318,7 +318,7 @@ &usbh1 { ...@@ -318,7 +318,7 @@ &usbh1 {
&usdhc3 { &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
cd-gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };
......
...@@ -324,7 +324,7 @@ &usbh1 { ...@@ -324,7 +324,7 @@ &usbh1 {
&usdhc3 { &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
cd-gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };
......
...@@ -417,7 +417,7 @@ &usbh1 { ...@@ -417,7 +417,7 @@ &usbh1 {
&usdhc3 { &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
cd-gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };
......
...@@ -299,6 +299,6 @@ &pinctrl_hummingboard_usdhc2_aux ...@@ -299,6 +299,6 @@ &pinctrl_hummingboard_usdhc2_aux
&pinctrl_hummingboard_usdhc2 &pinctrl_hummingboard_usdhc2
>; >;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
cd-gpios = <&gpio1 4 0>; cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";
}; };
...@@ -453,7 +453,7 @@ &usbotg { ...@@ -453,7 +453,7 @@ &usbotg {
&usdhc3 { &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
cd-gpios = <&gpio7 0 0>; cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };
...@@ -461,7 +461,7 @@ &usdhc3 { ...@@ -461,7 +461,7 @@ &usdhc3 {
&usdhc4 { &usdhc4 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc4>; pinctrl-0 = <&pinctrl_usdhc4>;
cd-gpios = <&gpio2 6 0>; cd-gpios = <&gpio2 6 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };
...@@ -409,8 +409,8 @@ &usbotg { ...@@ -409,8 +409,8 @@ &usbotg {
&usdhc2 { &usdhc2 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
cd-gpios = <&gpio1 4 0>; cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio1 2 0>; wp-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
status = "disabled"; status = "disabled";
}; };
...@@ -418,7 +418,7 @@ &usdhc3 { ...@@ -418,7 +418,7 @@ &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3 pinctrl-0 = <&pinctrl_usdhc3
&pinctrl_usdhc3_cdwp>; &pinctrl_usdhc3_cdwp>;
cd-gpios = <&gpio1 27 0>; cd-gpios = <&gpio1 27 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio1 29 0>; wp-gpios = <&gpio1 29 GPIO_ACTIVE_HIGH>;
status = "disabled"; status = "disabled";
}; };
...@@ -342,7 +342,7 @@ &usdhc2 { ...@@ -342,7 +342,7 @@ &usdhc2 {
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
bus-width = <4>; bus-width = <4>;
cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>; cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 3 GPIO_ACTIVE_LOW>; wp-gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
...@@ -351,6 +351,6 @@ &usdhc3 { ...@@ -351,6 +351,6 @@ &usdhc3 {
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
bus-width = <4>; bus-width = <4>;
cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>; cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 1 GPIO_ACTIVE_LOW>; wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
...@@ -467,8 +467,8 @@ &usdhc3 { ...@@ -467,8 +467,8 @@ &usdhc3 {
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
pinctrl-1 = <&pinctrl_usdhc3_100mhz>; pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
pinctrl-2 = <&pinctrl_usdhc3_200mhz>; pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
cd-gpios = <&gpio6 15 0>; cd-gpios = <&gpio6 15 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio1 13 0>; wp-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
......
...@@ -448,8 +448,8 @@ &usbotg { ...@@ -448,8 +448,8 @@ &usbotg {
&usdhc3 { &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
cd-gpios = <&gpio7 0 0>; cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio7 1 0>; wp-gpios = <&gpio7 1 GPIO_ACTIVE_HIGH>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };
...@@ -457,7 +457,7 @@ &usdhc3 { ...@@ -457,7 +457,7 @@ &usdhc3 {
&usdhc4 { &usdhc4 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc4>; pinctrl-0 = <&pinctrl_usdhc4>;
cd-gpios = <&gpio2 6 0>; cd-gpios = <&gpio2 6 GPIO_ACTIVE_LOW>;
vmmc-supply = <&reg_3p3v>; vmmc-supply = <&reg_3p3v>;
status = "okay"; status = "okay";
}; };
...@@ -562,8 +562,8 @@ &usdhc2 { ...@@ -562,8 +562,8 @@ &usdhc2 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
bus-width = <8>; bus-width = <8>;
cd-gpios = <&gpio2 2 0>; cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 3 0>; wp-gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
...@@ -571,8 +571,8 @@ &usdhc3 { ...@@ -571,8 +571,8 @@ &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
bus-width = <8>; bus-width = <8>;
cd-gpios = <&gpio2 0 0>; cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 1 0>; wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
......
...@@ -680,7 +680,7 @@ &usdhc1 { ...@@ -680,7 +680,7 @@ &usdhc1 {
pinctrl-0 = <&pinctrl_usdhc1>; pinctrl-0 = <&pinctrl_usdhc1>;
bus-width = <4>; bus-width = <4>;
no-1-8-v; no-1-8-v;
cd-gpios = <&gpio7 2 0>; cd-gpios = <&gpio7 2 GPIO_ACTIVE_LOW>;
fsl,wp-controller; fsl,wp-controller;
status = "okay"; status = "okay";
}; };
...@@ -690,7 +690,7 @@ &usdhc2 { ...@@ -690,7 +690,7 @@ &usdhc2 {
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
bus-width = <4>; bus-width = <4>;
no-1-8-v; no-1-8-v;
cd-gpios = <&gpio7 3 0>; cd-gpios = <&gpio7 3 GPIO_ACTIVE_LOW>;
fsl,wp-controller; fsl,wp-controller;
status = "okay"; status = "okay";
}; };
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
* *
*/ */
#include <dt-bindings/gpio/gpio.h>
/ { / {
regulators { regulators {
compatible = "simple-bus"; compatible = "simple-bus";
...@@ -250,13 +252,13 @@ &usbotg { ...@@ -250,13 +252,13 @@ &usbotg {
&usdhc1 { &usdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc1>; pinctrl-0 = <&pinctrl_usdhc1>;
cd-gpios = <&gpio1 2 0>; cd-gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";
}; };
&usdhc3 { &usdhc3 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
cd-gpios = <&gpio3 9 0>; cd-gpios = <&gpio3 9 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";
}; };
...@@ -617,8 +617,8 @@ &usdhc1 { ...@@ -617,8 +617,8 @@ &usdhc1 {
pinctrl-1 = <&pinctrl_usdhc1_100mhz>; pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
pinctrl-2 = <&pinctrl_usdhc1_200mhz>; pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
bus-width = <8>; bus-width = <8>;
cd-gpios = <&gpio4 7 0>; cd-gpios = <&gpio4 7 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio4 6 0>; wp-gpios = <&gpio4 6 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
...@@ -627,8 +627,8 @@ &usdhc2 { ...@@ -627,8 +627,8 @@ &usdhc2 {
pinctrl-0 = <&pinctrl_usdhc2>; pinctrl-0 = <&pinctrl_usdhc2>;
pinctrl-1 = <&pinctrl_usdhc2_100mhz>; pinctrl-1 = <&pinctrl_usdhc2_100mhz>;
pinctrl-2 = <&pinctrl_usdhc2_200mhz>; pinctrl-2 = <&pinctrl_usdhc2_200mhz>;
cd-gpios = <&gpio5 0 0>; cd-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio4 29 0>; wp-gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
...@@ -637,6 +637,6 @@ &usdhc3 { ...@@ -637,6 +637,6 @@ &usdhc3 {
pinctrl-0 = <&pinctrl_usdhc3>; pinctrl-0 = <&pinctrl_usdhc3>;
pinctrl-1 = <&pinctrl_usdhc3_100mhz>; pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
pinctrl-2 = <&pinctrl_usdhc3_200mhz>; pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
cd-gpios = <&gpio3 22 0>; cd-gpios = <&gpio3 22 GPIO_ACTIVE_LOW>;
status = "okay"; status = "okay";
}; };
...@@ -49,7 +49,7 @@ &usdhc3 { ...@@ -49,7 +49,7 @@ &usdhc3 {
pinctrl-1 = <&pinctrl_usdhc3_100mhz>; pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
pinctrl-2 = <&pinctrl_usdhc3_200mhz>; pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
bus-width = <8>; bus-width = <8>;
cd-gpios = <&gpio7 10 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio7 10 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>; wp-gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>;
keep-power-in-suspend; keep-power-in-suspend;
enable-sdio-wakeup; enable-sdio-wakeup;
...@@ -61,7 +61,7 @@ &usdhc4 { ...@@ -61,7 +61,7 @@ &usdhc4 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc4>; pinctrl-0 = <&pinctrl_usdhc4>;
bus-width = <8>; bus-width = <8>;
cd-gpios = <&gpio7 11 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio7 11 GPIO_ACTIVE_LOW>;
no-1-8-v; no-1-8-v;
keep-power-in-suspend; keep-power-in-suspend;
enable-sdio-wakup; enable-sdio-wakup;
......
...@@ -293,7 +293,7 @@ &usdhc3 { ...@@ -293,7 +293,7 @@ &usdhc3 {
pinctrl-1 = <&pinctrl_usdhc3_100mhz>; pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
pinctrl-2 = <&pinctrl_usdhc3_200mhz>; pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
bus-width = <8>; bus-width = <8>;
cd-gpios = <&gpio2 10 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio2 10 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio2 15 GPIO_ACTIVE_HIGH>; wp-gpios = <&gpio2 15 GPIO_ACTIVE_HIGH>;
keep-power-in-suspend; keep-power-in-suspend;
enable-sdio-wakeup; enable-sdio-wakeup;
...@@ -304,7 +304,7 @@ &usdhc3 { ...@@ -304,7 +304,7 @@ &usdhc3 {
&usdhc4 { &usdhc4 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc4>; pinctrl-0 = <&pinctrl_usdhc4>;
cd-gpios = <&gpio6 21 GPIO_ACTIVE_HIGH>; cd-gpios = <&gpio6 21 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio6 20 GPIO_ACTIVE_HIGH>; wp-gpios = <&gpio6 20 GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
......
...@@ -234,8 +234,8 @@ &uart1 { ...@@ -234,8 +234,8 @@ &uart1 {
&usdhc1 { &usdhc1 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc1>; pinctrl-0 = <&pinctrl_usdhc1>;
cd-gpios = <&gpio5 0 0>; cd-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
wp-gpios = <&gpio5 1 0>; wp-gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>;
enable-sdio-wakeup; enable-sdio-wakeup;
keep-power-in-suspend; keep-power-in-suspend;
status = "okay"; status = "okay";
......
...@@ -208,6 +208,8 @@ static ssize_t power_ro_lock_show(struct device *dev, ...@@ -208,6 +208,8 @@ static ssize_t power_ro_lock_show(struct device *dev,
ret = snprintf(buf, PAGE_SIZE, "%d\n", locked); ret = snprintf(buf, PAGE_SIZE, "%d\n", locked);
mmc_blk_put(md);
return ret; return ret;
} }
......
...@@ -779,6 +779,7 @@ config MMC_TOSHIBA_PCI ...@@ -779,6 +779,7 @@ config MMC_TOSHIBA_PCI
config MMC_MTK config MMC_MTK
tristate "MediaTek SD/MMC Card Interface support" tristate "MediaTek SD/MMC Card Interface support"
depends on HAS_DMA
help help
This selects the MediaTek(R) Secure digital and Multimedia card Interface. This selects the MediaTek(R) Secure digital and Multimedia card Interface.
If you have a machine with a integrated SD/MMC card reader, say Y or M here. If you have a machine with a integrated SD/MMC card reader, say Y or M here.
......
...@@ -1062,9 +1062,14 @@ static void omap_hsmmc_do_irq(struct omap_hsmmc_host *host, int status) ...@@ -1062,9 +1062,14 @@ static void omap_hsmmc_do_irq(struct omap_hsmmc_host *host, int status)
if (status & (CTO_EN | CCRC_EN)) if (status & (CTO_EN | CCRC_EN))
end_cmd = 1; end_cmd = 1;
if (host->data || host->response_busy) {
end_trans = !end_cmd;
host->response_busy = 0;
}
if (status & (CTO_EN | DTO_EN)) if (status & (CTO_EN | DTO_EN))
hsmmc_command_incomplete(host, -ETIMEDOUT, end_cmd); hsmmc_command_incomplete(host, -ETIMEDOUT, end_cmd);
else if (status & (CCRC_EN | DCRC_EN)) else if (status & (CCRC_EN | DCRC_EN | DEB_EN | CEB_EN |
BADA_EN))
hsmmc_command_incomplete(host, -EILSEQ, end_cmd); hsmmc_command_incomplete(host, -EILSEQ, end_cmd);
if (status & ACE_EN) { if (status & ACE_EN) {
...@@ -1081,10 +1086,6 @@ static void omap_hsmmc_do_irq(struct omap_hsmmc_host *host, int status) ...@@ -1081,10 +1086,6 @@ static void omap_hsmmc_do_irq(struct omap_hsmmc_host *host, int status)
} }
dev_dbg(mmc_dev(host->mmc), "AC12 err: 0x%x\n", ac12); dev_dbg(mmc_dev(host->mmc), "AC12 err: 0x%x\n", ac12);
} }
if (host->data || host->response_busy) {
end_trans = !end_cmd;
host->response_busy = 0;
}
} }
OMAP_HSMMC_WRITE(host->base, STAT, status); OMAP_HSMMC_WRITE(host->base, STAT, status);
......
...@@ -581,12 +581,7 @@ static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg) ...@@ -581,12 +581,7 @@ static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg)
static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host *host) static unsigned int esdhc_pltfm_get_max_clock(struct sdhci_host *host)
{ {
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
struct pltfm_imx_data *imx_data = pltfm_host->priv;
struct esdhc_platform_data *boarddata = &imx_data->boarddata;
if (boarddata->f_max && (boarddata->f_max < pltfm_host->clock))
return boarddata->f_max;
else
return pltfm_host->clock; return pltfm_host->clock;
} }
...@@ -878,34 +873,19 @@ static const struct sdhci_pltfm_data sdhci_esdhc_imx_pdata = { ...@@ -878,34 +873,19 @@ static const struct sdhci_pltfm_data sdhci_esdhc_imx_pdata = {
static int static int
sdhci_esdhc_imx_probe_dt(struct platform_device *pdev, sdhci_esdhc_imx_probe_dt(struct platform_device *pdev,
struct sdhci_host *host, struct sdhci_host *host,
struct esdhc_platform_data *boarddata) struct pltfm_imx_data *imx_data)
{ {
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
struct esdhc_platform_data *boarddata = &imx_data->boarddata;
if (!np) int ret;
return -ENODEV;
if (of_get_property(np, "non-removable", NULL))
boarddata->cd_type = ESDHC_CD_PERMANENT;
if (of_get_property(np, "fsl,cd-controller", NULL))
boarddata->cd_type = ESDHC_CD_CONTROLLER;
if (of_get_property(np, "fsl,wp-controller", NULL)) if (of_get_property(np, "fsl,wp-controller", NULL))
boarddata->wp_type = ESDHC_WP_CONTROLLER; boarddata->wp_type = ESDHC_WP_CONTROLLER;
boarddata->cd_gpio = of_get_named_gpio(np, "cd-gpios", 0);
if (gpio_is_valid(boarddata->cd_gpio))
boarddata->cd_type = ESDHC_CD_GPIO;
boarddata->wp_gpio = of_get_named_gpio(np, "wp-gpios", 0); boarddata->wp_gpio = of_get_named_gpio(np, "wp-gpios", 0);
if (gpio_is_valid(boarddata->wp_gpio)) if (gpio_is_valid(boarddata->wp_gpio))
boarddata->wp_type = ESDHC_WP_GPIO; boarddata->wp_type = ESDHC_WP_GPIO;
of_property_read_u32(np, "bus-width", &boarddata->max_bus_width);
of_property_read_u32(np, "max-frequency", &boarddata->f_max);
if (of_find_property(np, "no-1-8-v", NULL)) if (of_find_property(np, "no-1-8-v", NULL))
boarddata->support_vsel = false; boarddata->support_vsel = false;
else else
...@@ -916,29 +896,119 @@ sdhci_esdhc_imx_probe_dt(struct platform_device *pdev, ...@@ -916,29 +896,119 @@ sdhci_esdhc_imx_probe_dt(struct platform_device *pdev,
mmc_of_parse_voltage(np, &host->ocr_mask); mmc_of_parse_voltage(np, &host->ocr_mask);
/* sdr50 and sdr104 needs work on 1.8v signal voltage */
if ((boarddata->support_vsel) && esdhc_is_usdhc(imx_data) &&
!IS_ERR(imx_data->pins_default)) {
imx_data->pins_100mhz = pinctrl_lookup_state(imx_data->pinctrl,
ESDHC_PINCTRL_STATE_100MHZ);
imx_data->pins_200mhz = pinctrl_lookup_state(imx_data->pinctrl,
ESDHC_PINCTRL_STATE_200MHZ);
if (IS_ERR(imx_data->pins_100mhz) ||
IS_ERR(imx_data->pins_200mhz)) {
dev_warn(mmc_dev(host->mmc),
"could not get ultra high speed state, work on normal mode\n");
/*
* fall back to not support uhs by specify no 1.8v quirk
*/
host->quirks2 |= SDHCI_QUIRK2_NO_1_8_V;
}
} else {
host->quirks2 |= SDHCI_QUIRK2_NO_1_8_V;
}
/* call to generic mmc_of_parse to support additional capabilities */ /* call to generic mmc_of_parse to support additional capabilities */
return mmc_of_parse(host->mmc); ret = mmc_of_parse(host->mmc);
if (ret)
return ret;
if (!IS_ERR_VALUE(mmc_gpio_get_cd(host->mmc)))
host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION;
return 0;
} }
#else #else
static inline int static inline int
sdhci_esdhc_imx_probe_dt(struct platform_device *pdev, sdhci_esdhc_imx_probe_dt(struct platform_device *pdev,
struct sdhci_host *host, struct sdhci_host *host,
struct esdhc_platform_data *boarddata) struct pltfm_imx_data *imx_data)
{ {
return -ENODEV; return -ENODEV;
} }
#endif #endif
static int sdhci_esdhc_imx_probe_nondt(struct platform_device *pdev,
struct sdhci_host *host,
struct pltfm_imx_data *imx_data)
{
struct esdhc_platform_data *boarddata = &imx_data->boarddata;
int err;
if (!host->mmc->parent->platform_data) {
dev_err(mmc_dev(host->mmc), "no board data!\n");
return -EINVAL;
}
imx_data->boarddata = *((struct esdhc_platform_data *)
host->mmc->parent->platform_data);
/* write_protect */
if (boarddata->wp_type == ESDHC_WP_GPIO) {
err = mmc_gpio_request_ro(host->mmc, boarddata->wp_gpio);
if (err) {
dev_err(mmc_dev(host->mmc),
"failed to request write-protect gpio!\n");
return err;
}
host->mmc->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH;
}
/* card_detect */
switch (boarddata->cd_type) {
case ESDHC_CD_GPIO:
err = mmc_gpio_request_cd(host->mmc, boarddata->cd_gpio, 0);
if (err) {
dev_err(mmc_dev(host->mmc),
"failed to request card-detect gpio!\n");
return err;
}
/* fall through */
case ESDHC_CD_CONTROLLER:
/* we have a working card_detect back */
host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION;
break;
case ESDHC_CD_PERMANENT:
host->mmc->caps |= MMC_CAP_NONREMOVABLE;
break;
case ESDHC_CD_NONE:
break;
}
switch (boarddata->max_bus_width) {
case 8:
host->mmc->caps |= MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA;
break;
case 4:
host->mmc->caps |= MMC_CAP_4_BIT_DATA;
break;
case 1:
default:
host->quirks |= SDHCI_QUIRK_FORCE_1_BIT_DATA;
break;
}
return 0;
}
static int sdhci_esdhc_imx_probe(struct platform_device *pdev) static int sdhci_esdhc_imx_probe(struct platform_device *pdev)
{ {
const struct of_device_id *of_id = const struct of_device_id *of_id =
of_match_device(imx_esdhc_dt_ids, &pdev->dev); of_match_device(imx_esdhc_dt_ids, &pdev->dev);
struct sdhci_pltfm_host *pltfm_host; struct sdhci_pltfm_host *pltfm_host;
struct sdhci_host *host; struct sdhci_host *host;
struct esdhc_platform_data *boarddata;
int err; int err;
struct pltfm_imx_data *imx_data; struct pltfm_imx_data *imx_data;
bool dt = true;
host = sdhci_pltfm_init(pdev, &sdhci_esdhc_imx_pdata, 0); host = sdhci_pltfm_init(pdev, &sdhci_esdhc_imx_pdata, 0);
if (IS_ERR(host)) if (IS_ERR(host))
...@@ -1030,84 +1100,12 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev) ...@@ -1030,84 +1100,12 @@ static int sdhci_esdhc_imx_probe(struct platform_device *pdev)
if (imx_data->socdata->flags & ESDHC_FLAG_ERR004536) if (imx_data->socdata->flags & ESDHC_FLAG_ERR004536)
host->quirks |= SDHCI_QUIRK_BROKEN_ADMA; host->quirks |= SDHCI_QUIRK_BROKEN_ADMA;
boarddata = &imx_data->boarddata; if (of_id)
if (sdhci_esdhc_imx_probe_dt(pdev, host, boarddata) < 0) { err = sdhci_esdhc_imx_probe_dt(pdev, host, imx_data);
if (!host->mmc->parent->platform_data) { else
dev_err(mmc_dev(host->mmc), "no board data!\n"); err = sdhci_esdhc_imx_probe_nondt(pdev, host, imx_data);
err = -EINVAL; if (err)
goto disable_clk;
}
imx_data->boarddata = *((struct esdhc_platform_data *)
host->mmc->parent->platform_data);
dt = false;
}
/* write_protect */
if (boarddata->wp_type == ESDHC_WP_GPIO && !dt) {
err = mmc_gpio_request_ro(host->mmc, boarddata->wp_gpio);
if (err) {
dev_err(mmc_dev(host->mmc),
"failed to request write-protect gpio!\n");
goto disable_clk;
}
host->mmc->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH;
}
/* card_detect */
switch (boarddata->cd_type) {
case ESDHC_CD_GPIO:
if (dt)
break;
err = mmc_gpio_request_cd(host->mmc, boarddata->cd_gpio, 0);
if (err) {
dev_err(mmc_dev(host->mmc),
"failed to request card-detect gpio!\n");
goto disable_clk; goto disable_clk;
}
/* fall through */
case ESDHC_CD_CONTROLLER:
/* we have a working card_detect back */
host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION;
break;
case ESDHC_CD_PERMANENT:
host->mmc->caps |= MMC_CAP_NONREMOVABLE;
break;
case ESDHC_CD_NONE:
break;
}
switch (boarddata->max_bus_width) {
case 8:
host->mmc->caps |= MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA;
break;
case 4:
host->mmc->caps |= MMC_CAP_4_BIT_DATA;
break;
case 1:
default:
host->quirks |= SDHCI_QUIRK_FORCE_1_BIT_DATA;
break;
}
/* sdr50 and sdr104 needs work on 1.8v signal voltage */
if ((boarddata->support_vsel) && esdhc_is_usdhc(imx_data) &&
!IS_ERR(imx_data->pins_default)) {
imx_data->pins_100mhz = pinctrl_lookup_state(imx_data->pinctrl,
ESDHC_PINCTRL_STATE_100MHZ);
imx_data->pins_200mhz = pinctrl_lookup_state(imx_data->pinctrl,
ESDHC_PINCTRL_STATE_200MHZ);
if (IS_ERR(imx_data->pins_100mhz) ||
IS_ERR(imx_data->pins_200mhz)) {
dev_warn(mmc_dev(host->mmc),
"could not get ultra high speed state, work on normal mode\n");
/* fall back to not support uhs by specify no 1.8v quirk */
host->quirks2 |= SDHCI_QUIRK2_NO_1_8_V;
}
} else {
host->quirks2 |= SDHCI_QUIRK2_NO_1_8_V;
}
err = sdhci_add_host(host); err = sdhci_add_host(host);
if (err) if (err)
......
...@@ -45,6 +45,6 @@ ...@@ -45,6 +45,6 @@
#define ESDHC_DMA_SYSCTL 0x40c #define ESDHC_DMA_SYSCTL 0x40c
#define ESDHC_DMA_SNOOP 0x00000040 #define ESDHC_DMA_SNOOP 0x00000040
#define ESDHC_HOST_CONTROL_RES 0x05 #define ESDHC_HOST_CONTROL_RES 0x01
#endif /* _DRIVERS_MMC_SDHCI_ESDHC_H */ #endif /* _DRIVERS_MMC_SDHCI_ESDHC_H */
...@@ -411,6 +411,7 @@ static int sdhci_pxav3_probe(struct platform_device *pdev) ...@@ -411,6 +411,7 @@ static int sdhci_pxav3_probe(struct platform_device *pdev)
goto err_of_parse; goto err_of_parse;
sdhci_get_of_property(pdev); sdhci_get_of_property(pdev);
pdata = pxav3_get_mmc_pdata(dev); pdata = pxav3_get_mmc_pdata(dev);
pdev->dev.platform_data = pdata;
} else if (pdata) { } else if (pdata) {
/* on-chip device */ /* on-chip device */
if (pdata->flags & PXA_FLAG_CARD_PERMANENT) if (pdata->flags & PXA_FLAG_CARD_PERMANENT)
......
...@@ -2866,6 +2866,7 @@ int sdhci_add_host(struct sdhci_host *host) ...@@ -2866,6 +2866,7 @@ int sdhci_add_host(struct sdhci_host *host)
u32 max_current_caps; u32 max_current_caps;
unsigned int ocr_avail; unsigned int ocr_avail;
unsigned int override_timeout_clk; unsigned int override_timeout_clk;
u32 max_clk;
int ret; int ret;
WARN_ON(host == NULL); WARN_ON(host == NULL);
...@@ -2978,8 +2979,11 @@ int sdhci_add_host(struct sdhci_host *host) ...@@ -2978,8 +2979,11 @@ int sdhci_add_host(struct sdhci_host *host)
GFP_KERNEL); GFP_KERNEL);
host->align_buffer = kmalloc(host->align_buffer_sz, GFP_KERNEL); host->align_buffer = kmalloc(host->align_buffer_sz, GFP_KERNEL);
if (!host->adma_table || !host->align_buffer) { if (!host->adma_table || !host->align_buffer) {
dma_free_coherent(mmc_dev(mmc), host->adma_table_sz, if (host->adma_table)
host->adma_table, host->adma_addr); dma_free_coherent(mmc_dev(mmc),
host->adma_table_sz,
host->adma_table,
host->adma_addr);
kfree(host->align_buffer); kfree(host->align_buffer);
pr_warn("%s: Unable to allocate ADMA buffers - falling back to standard DMA\n", pr_warn("%s: Unable to allocate ADMA buffers - falling back to standard DMA\n",
mmc_hostname(mmc)); mmc_hostname(mmc));
...@@ -3047,18 +3051,22 @@ int sdhci_add_host(struct sdhci_host *host) ...@@ -3047,18 +3051,22 @@ int sdhci_add_host(struct sdhci_host *host)
* Set host parameters. * Set host parameters.
*/ */
mmc->ops = &sdhci_ops; mmc->ops = &sdhci_ops;
mmc->f_max = host->max_clk; max_clk = host->max_clk;
if (host->ops->get_min_clock) if (host->ops->get_min_clock)
mmc->f_min = host->ops->get_min_clock(host); mmc->f_min = host->ops->get_min_clock(host);
else if (host->version >= SDHCI_SPEC_300) { else if (host->version >= SDHCI_SPEC_300) {
if (host->clk_mul) { if (host->clk_mul) {
mmc->f_min = (host->max_clk * host->clk_mul) / 1024; mmc->f_min = (host->max_clk * host->clk_mul) / 1024;
mmc->f_max = host->max_clk * host->clk_mul; max_clk = host->max_clk * host->clk_mul;
} else } else
mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300; mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300;
} else } else
mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_200; mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_200;
if (!mmc->f_max || (mmc->f_max && (mmc->f_max > max_clk)))
mmc->f_max = max_clk;
if (!(host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK)) { if (!(host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK)) {
host->timeout_clk = (caps[0] & SDHCI_TIMEOUT_CLK_MASK) >> host->timeout_clk = (caps[0] & SDHCI_TIMEOUT_CLK_MASK) >>
SDHCI_TIMEOUT_CLK_SHIFT; SDHCI_TIMEOUT_CLK_SHIFT;
......
...@@ -43,7 +43,6 @@ struct esdhc_platform_data { ...@@ -43,7 +43,6 @@ struct esdhc_platform_data {
enum wp_types wp_type; enum wp_types wp_type;
enum cd_types cd_type; enum cd_types cd_type;
int max_bus_width; int max_bus_width;
unsigned int f_max;
bool support_vsel; bool support_vsel;
unsigned int delay_line; unsigned int delay_line;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment