Commit a38b461e authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'mmc-v4.12-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc

Pull MMC fixes from Ulf Hansson:
 "This contains fixes to make the WiFi work again for the ARM64 Hikey
  board.

  Together with a couple of DTS updates for the Hikey board we have also
  extended the mmc pwrseq_simple, to support a new power-off-delay-us DT
  property, as that was required to enable a graceful power off sequence
  for the WiFi chip"

* tag 'mmc-v4.12-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc:
  arm64: dts: hikey: Fix WiFi support
  arm64: dts: hi6220: Move board data from the dwmmc nodes to hikey dts
  arm64: dts: hikey: Add the SYS_5V and the VDD_3V3 regulators
  arm64: dts: hi6220: Move the fixed_5v_hub regulator to the hikey dts
  arm64: dts: hikey: Add clock for the pmic mfd
  mfd: dts: hi655x: Add clock binding for the pmic
  mmc: pwrseq_simple: Parse DTS for the power-off-delay-us property
  mmc: dt: pwrseq-simple: Invent power-off-delay-us
parents e95806df ea452678
...@@ -16,6 +16,11 @@ Required properties: ...@@ -16,6 +16,11 @@ Required properties:
- reg: Base address of PMIC on Hi6220 SoC. - reg: Base address of PMIC on Hi6220 SoC.
- interrupt-controller: Hi655x has internal IRQs (has own IRQ domain). - interrupt-controller: Hi655x has internal IRQs (has own IRQ domain).
- pmic-gpios: The GPIO used by PMIC IRQ. - pmic-gpios: The GPIO used by PMIC IRQ.
- #clock-cells: From common clock binding; shall be set to 0
Optional properties:
- clock-output-names: From common clock binding to override the
default output clock name
Example: Example:
pmic: pmic@f8000000 { pmic: pmic@f8000000 {
...@@ -24,4 +29,5 @@ Example: ...@@ -24,4 +29,5 @@ Example:
interrupt-controller; interrupt-controller;
#interrupt-cells = <2>; #interrupt-cells = <2>;
pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>; pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
#clock-cells = <0>;
} }
...@@ -18,6 +18,8 @@ Optional properties: ...@@ -18,6 +18,8 @@ Optional properties:
"ext_clock" (External clock provided to the card). "ext_clock" (External clock provided to the card).
- post-power-on-delay-ms : Delay in ms after powering the card and - post-power-on-delay-ms : Delay in ms after powering the card and
de-asserting the reset-gpios (if any) de-asserting the reset-gpios (if any)
- power-off-delay-us : Delay in us after asserting the reset-gpios (if any)
during power off of the card.
Example: Example:
......
...@@ -81,6 +81,45 @@ reboot-mode { ...@@ -81,6 +81,45 @@ reboot-mode {
}; };
}; };
reg_sys_5v: regulator@0 {
compatible = "regulator-fixed";
regulator-name = "SYS_5V";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
regulator-boot-on;
regulator-always-on;
};
reg_vdd_3v3: regulator@1 {
compatible = "regulator-fixed";
regulator-name = "VDD_3V3";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-boot-on;
regulator-always-on;
vin-supply = <&reg_sys_5v>;
};
reg_5v_hub: regulator@2 {
compatible = "regulator-fixed";
regulator-name = "5V_HUB";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
regulator-boot-on;
gpio = <&gpio0 7 0>;
regulator-always-on;
vin-supply = <&reg_sys_5v>;
};
wl1835_pwrseq: wl1835-pwrseq {
compatible = "mmc-pwrseq-simple";
/* WLAN_EN GPIO */
reset-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>;
clocks = <&pmic>;
clock-names = "ext_clock";
power-off-delay-us = <10>;
};
soc { soc {
spi0: spi@f7106000 { spi0: spi@f7106000 {
status = "ok"; status = "ok";
...@@ -256,11 +295,31 @@ gpio15: gpio@f702b000 { ...@@ -256,11 +295,31 @@ gpio15: gpio@f702b000 {
/* GPIO blocks 16 thru 19 do not appear to be routed to pins */ /* GPIO blocks 16 thru 19 do not appear to be routed to pins */
dwmmc_0: dwmmc0@f723d000 {
cap-mmc-highspeed;
non-removable;
bus-width = <0x8>;
vmmc-supply = <&ldo19>;
};
dwmmc_1: dwmmc1@f723e000 {
card-detect-delay = <200>;
cap-sd-highspeed;
sd-uhs-sdr12;
sd-uhs-sdr25;
sd-uhs-sdr50;
vqmmc-supply = <&ldo7>;
vmmc-supply = <&ldo10>;
bus-width = <0x4>;
disable-wp;
cd-gpios = <&gpio1 0 1>;
};
dwmmc_2: dwmmc2@f723f000 { dwmmc_2: dwmmc2@f723f000 {
ti,non-removable; bus-width = <0x4>;
non-removable; non-removable;
/* WL_EN */ vmmc-supply = <&reg_vdd_3v3>;
vmmc-supply = <&wlan_en_reg>; mmc-pwrseq = <&wl1835_pwrseq>;
#address-cells = <0x1>; #address-cells = <0x1>;
#size-cells = <0x0>; #size-cells = <0x0>;
...@@ -272,18 +331,6 @@ wlcore: wlcore@2 { ...@@ -272,18 +331,6 @@ wlcore: wlcore@2 {
interrupts = <3 IRQ_TYPE_EDGE_RISING>; interrupts = <3 IRQ_TYPE_EDGE_RISING>;
}; };
}; };
wlan_en_reg: regulator@1 {
compatible = "regulator-fixed";
regulator-name = "wlan-en-regulator";
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
/* WLAN_EN GPIO */
gpio = <&gpio0 5 0>;
/* WLAN card specific delay */
startup-delay-us = <70000>;
enable-active-high;
};
}; };
leds { leds {
...@@ -330,6 +377,7 @@ bt_active_led { ...@@ -330,6 +377,7 @@ bt_active_led {
pmic: pmic@f8000000 { pmic: pmic@f8000000 {
compatible = "hisilicon,hi655x-pmic"; compatible = "hisilicon,hi655x-pmic";
reg = <0x0 0xf8000000 0x0 0x1000>; reg = <0x0 0xf8000000 0x0 0x1000>;
#clock-cells = <0>;
interrupt-controller; interrupt-controller;
#interrupt-cells = <2>; #interrupt-cells = <2>;
pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>; pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
......
...@@ -725,20 +725,10 @@ i2c2: i2c@f7102000 { ...@@ -725,20 +725,10 @@ i2c2: i2c@f7102000 {
status = "disabled"; status = "disabled";
}; };
fixed_5v_hub: regulator@0 {
compatible = "regulator-fixed";
regulator-name = "fixed_5v_hub";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
regulator-boot-on;
gpio = <&gpio0 7 0>;
regulator-always-on;
};
usb_phy: usbphy { usb_phy: usbphy {
compatible = "hisilicon,hi6220-usb-phy"; compatible = "hisilicon,hi6220-usb-phy";
#phy-cells = <0>; #phy-cells = <0>;
phy-supply = <&fixed_5v_hub>; phy-supply = <&reg_5v_hub>;
hisilicon,peripheral-syscon = <&sys_ctrl>; hisilicon,peripheral-syscon = <&sys_ctrl>;
}; };
...@@ -766,17 +756,12 @@ mailbox: mailbox@f7510000 { ...@@ -766,17 +756,12 @@ mailbox: mailbox@f7510000 {
dwmmc_0: dwmmc0@f723d000 { dwmmc_0: dwmmc0@f723d000 {
compatible = "hisilicon,hi6220-dw-mshc"; compatible = "hisilicon,hi6220-dw-mshc";
num-slots = <0x1>;
cap-mmc-highspeed;
non-removable;
reg = <0x0 0xf723d000 0x0 0x1000>; reg = <0x0 0xf723d000 0x0 0x1000>;
interrupts = <0x0 0x48 0x4>; interrupts = <0x0 0x48 0x4>;
clocks = <&sys_ctrl 2>, <&sys_ctrl 1>; clocks = <&sys_ctrl 2>, <&sys_ctrl 1>;
clock-names = "ciu", "biu"; clock-names = "ciu", "biu";
resets = <&sys_ctrl PERIPH_RSTDIS0_MMC0>; resets = <&sys_ctrl PERIPH_RSTDIS0_MMC0>;
reset-names = "reset"; reset-names = "reset";
bus-width = <0x8>;
vmmc-supply = <&ldo19>;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&emmc_pmx_func &emmc_clk_cfg_func pinctrl-0 = <&emmc_pmx_func &emmc_clk_cfg_func
&emmc_cfg_func &emmc_rst_cfg_func>; &emmc_cfg_func &emmc_rst_cfg_func>;
...@@ -784,13 +769,7 @@ dwmmc_0: dwmmc0@f723d000 { ...@@ -784,13 +769,7 @@ dwmmc_0: dwmmc0@f723d000 {
dwmmc_1: dwmmc1@f723e000 { dwmmc_1: dwmmc1@f723e000 {
compatible = "hisilicon,hi6220-dw-mshc"; compatible = "hisilicon,hi6220-dw-mshc";
num-slots = <0x1>;
card-detect-delay = <200>;
hisilicon,peripheral-syscon = <&ao_ctrl>; hisilicon,peripheral-syscon = <&ao_ctrl>;
cap-sd-highspeed;
sd-uhs-sdr12;
sd-uhs-sdr25;
sd-uhs-sdr50;
reg = <0x0 0xf723e000 0x0 0x1000>; reg = <0x0 0xf723e000 0x0 0x1000>;
interrupts = <0x0 0x49 0x4>; interrupts = <0x0 0x49 0x4>;
#address-cells = <0x1>; #address-cells = <0x1>;
...@@ -799,11 +778,6 @@ dwmmc_1: dwmmc1@f723e000 { ...@@ -799,11 +778,6 @@ dwmmc_1: dwmmc1@f723e000 {
clock-names = "ciu", "biu"; clock-names = "ciu", "biu";
resets = <&sys_ctrl PERIPH_RSTDIS0_MMC1>; resets = <&sys_ctrl PERIPH_RSTDIS0_MMC1>;
reset-names = "reset"; reset-names = "reset";
vqmmc-supply = <&ldo7>;
vmmc-supply = <&ldo10>;
bus-width = <0x4>;
disable-wp;
cd-gpios = <&gpio1 0 1>;
pinctrl-names = "default", "idle"; pinctrl-names = "default", "idle";
pinctrl-0 = <&sd_pmx_func &sd_clk_cfg_func &sd_cfg_func>; pinctrl-0 = <&sd_pmx_func &sd_clk_cfg_func &sd_cfg_func>;
pinctrl-1 = <&sd_pmx_idle &sd_clk_cfg_idle &sd_cfg_idle>; pinctrl-1 = <&sd_pmx_idle &sd_clk_cfg_idle &sd_cfg_idle>;
...@@ -811,15 +785,12 @@ dwmmc_1: dwmmc1@f723e000 { ...@@ -811,15 +785,12 @@ dwmmc_1: dwmmc1@f723e000 {
dwmmc_2: dwmmc2@f723f000 { dwmmc_2: dwmmc2@f723f000 {
compatible = "hisilicon,hi6220-dw-mshc"; compatible = "hisilicon,hi6220-dw-mshc";
num-slots = <0x1>;
reg = <0x0 0xf723f000 0x0 0x1000>; reg = <0x0 0xf723f000 0x0 0x1000>;
interrupts = <0x0 0x4a 0x4>; interrupts = <0x0 0x4a 0x4>;
clocks = <&sys_ctrl HI6220_MMC2_CIUCLK>, <&sys_ctrl HI6220_MMC2_CLK>; clocks = <&sys_ctrl HI6220_MMC2_CIUCLK>, <&sys_ctrl HI6220_MMC2_CLK>;
clock-names = "ciu", "biu"; clock-names = "ciu", "biu";
resets = <&sys_ctrl PERIPH_RSTDIS0_MMC2>; resets = <&sys_ctrl PERIPH_RSTDIS0_MMC2>;
reset-names = "reset"; reset-names = "reset";
bus-width = <0x4>;
broken-cd;
pinctrl-names = "default", "idle"; pinctrl-names = "default", "idle";
pinctrl-0 = <&sdio_pmx_func &sdio_clk_cfg_func &sdio_cfg_func>; pinctrl-0 = <&sdio_pmx_func &sdio_clk_cfg_func &sdio_cfg_func>;
pinctrl-1 = <&sdio_pmx_idle &sdio_clk_cfg_idle &sdio_cfg_idle>; pinctrl-1 = <&sdio_pmx_idle &sdio_clk_cfg_idle &sdio_cfg_idle>;
......
...@@ -27,6 +27,7 @@ struct mmc_pwrseq_simple { ...@@ -27,6 +27,7 @@ struct mmc_pwrseq_simple {
struct mmc_pwrseq pwrseq; struct mmc_pwrseq pwrseq;
bool clk_enabled; bool clk_enabled;
u32 post_power_on_delay_ms; u32 post_power_on_delay_ms;
u32 power_off_delay_us;
struct clk *ext_clk; struct clk *ext_clk;
struct gpio_descs *reset_gpios; struct gpio_descs *reset_gpios;
}; };
...@@ -78,6 +79,10 @@ static void mmc_pwrseq_simple_power_off(struct mmc_host *host) ...@@ -78,6 +79,10 @@ static void mmc_pwrseq_simple_power_off(struct mmc_host *host)
mmc_pwrseq_simple_set_gpios_value(pwrseq, 1); mmc_pwrseq_simple_set_gpios_value(pwrseq, 1);
if (pwrseq->power_off_delay_us)
usleep_range(pwrseq->power_off_delay_us,
2 * pwrseq->power_off_delay_us);
if (!IS_ERR(pwrseq->ext_clk) && pwrseq->clk_enabled) { if (!IS_ERR(pwrseq->ext_clk) && pwrseq->clk_enabled) {
clk_disable_unprepare(pwrseq->ext_clk); clk_disable_unprepare(pwrseq->ext_clk);
pwrseq->clk_enabled = false; pwrseq->clk_enabled = false;
...@@ -119,6 +124,8 @@ static int mmc_pwrseq_simple_probe(struct platform_device *pdev) ...@@ -119,6 +124,8 @@ static int mmc_pwrseq_simple_probe(struct platform_device *pdev)
device_property_read_u32(dev, "post-power-on-delay-ms", device_property_read_u32(dev, "post-power-on-delay-ms",
&pwrseq->post_power_on_delay_ms); &pwrseq->post_power_on_delay_ms);
device_property_read_u32(dev, "power-off-delay-us",
&pwrseq->power_off_delay_us);
pwrseq->pwrseq.dev = dev; pwrseq->pwrseq.dev = dev;
pwrseq->pwrseq.ops = &mmc_pwrseq_simple_ops; pwrseq->pwrseq.ops = &mmc_pwrseq_simple_ops;
......
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