Commit a38b461e authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -16,6 +16,11 @@ Required properties:
- reg:                  Base address of PMIC on Hi6220 SoC.
- interrupt-controller: Hi655x has internal IRQs (has own IRQ domain).
- 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:
	pmic: pmic@f8000000 {
@@ -24,4 +29,5 @@ Example:
		interrupt-controller;
		#interrupt-cells = <2>;
		pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
		#clock-cells = <0>;
	}
+2 −0
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ Optional properties:
  "ext_clock" (External clock provided to the card).
- post-power-on-delay-ms : Delay in ms after powering the card and
	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:

+63 −15
Original line number Diff line number Diff line
@@ -81,6 +81,45 @@
		};
	};

	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 {
		spi0: spi@f7106000 {
			status = "ok";
@@ -256,11 +295,31 @@

		/* 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 {
			ti,non-removable;
			bus-width = <0x4>;
			non-removable;
			/* WL_EN */
			vmmc-supply = <&wlan_en_reg>;
			vmmc-supply = <&reg_vdd_3v3>;
			mmc-pwrseq = <&wl1835_pwrseq>;

			#address-cells = <0x1>;
			#size-cells = <0x0>;
@@ -272,18 +331,6 @@
				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 {
@@ -330,6 +377,7 @@
	pmic: pmic@f8000000 {
		compatible = "hisilicon,hi655x-pmic";
		reg = <0x0 0xf8000000 0x0 0x1000>;
		#clock-cells = <0>;
		interrupt-controller;
		#interrupt-cells = <2>;
		pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+1 −30
Original line number Diff line number Diff line
@@ -725,20 +725,10 @@
			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 {
			compatible = "hisilicon,hi6220-usb-phy";
			#phy-cells = <0>;
			phy-supply = <&fixed_5v_hub>;
			phy-supply = <&reg_5v_hub>;
			hisilicon,peripheral-syscon = <&sys_ctrl>;
		};

@@ -766,17 +756,12 @@

		dwmmc_0: dwmmc0@f723d000 {
			compatible = "hisilicon,hi6220-dw-mshc";
			num-slots = <0x1>;
			cap-mmc-highspeed;
			non-removable;
			reg = <0x0 0xf723d000 0x0 0x1000>;
			interrupts = <0x0 0x48 0x4>;
			clocks = <&sys_ctrl 2>, <&sys_ctrl 1>;
			clock-names = "ciu", "biu";
			resets = <&sys_ctrl PERIPH_RSTDIS0_MMC0>;
			reset-names = "reset";
			bus-width = <0x8>;
			vmmc-supply = <&ldo19>;
			pinctrl-names = "default";
			pinctrl-0 = <&emmc_pmx_func &emmc_clk_cfg_func
				     &emmc_cfg_func &emmc_rst_cfg_func>;
@@ -784,13 +769,7 @@

		dwmmc_1: dwmmc1@f723e000 {
			compatible = "hisilicon,hi6220-dw-mshc";
			num-slots = <0x1>;
			card-detect-delay = <200>;
			hisilicon,peripheral-syscon = <&ao_ctrl>;
			cap-sd-highspeed;
			sd-uhs-sdr12;
			sd-uhs-sdr25;
			sd-uhs-sdr50;
			reg = <0x0 0xf723e000 0x0 0x1000>;
			interrupts = <0x0 0x49 0x4>;
			#address-cells = <0x1>;
@@ -799,11 +778,6 @@
			clock-names = "ciu", "biu";
			resets = <&sys_ctrl PERIPH_RSTDIS0_MMC1>;
			reset-names = "reset";
			vqmmc-supply = <&ldo7>;
			vmmc-supply = <&ldo10>;
			bus-width = <0x4>;
			disable-wp;
			cd-gpios = <&gpio1 0 1>;
			pinctrl-names = "default", "idle";
			pinctrl-0 = <&sd_pmx_func &sd_clk_cfg_func &sd_cfg_func>;
			pinctrl-1 = <&sd_pmx_idle &sd_clk_cfg_idle &sd_cfg_idle>;
@@ -811,15 +785,12 @@

		dwmmc_2: dwmmc2@f723f000 {
			compatible = "hisilicon,hi6220-dw-mshc";
			num-slots = <0x1>;
			reg = <0x0 0xf723f000 0x0 0x1000>;
			interrupts = <0x0 0x4a 0x4>;
			clocks = <&sys_ctrl HI6220_MMC2_CIUCLK>, <&sys_ctrl HI6220_MMC2_CLK>;
			clock-names = "ciu", "biu";
			resets = <&sys_ctrl PERIPH_RSTDIS0_MMC2>;
			reset-names = "reset";
			bus-width = <0x4>;
			broken-cd;
			pinctrl-names = "default", "idle";
			pinctrl-0 = <&sdio_pmx_func &sdio_clk_cfg_func &sdio_cfg_func>;
			pinctrl-1 = <&sdio_pmx_idle &sdio_clk_cfg_idle &sdio_cfg_idle>;
+7 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ struct mmc_pwrseq_simple {
	struct mmc_pwrseq pwrseq;
	bool clk_enabled;
	u32 post_power_on_delay_ms;
	u32 power_off_delay_us;
	struct clk *ext_clk;
	struct gpio_descs *reset_gpios;
};
@@ -78,6 +79,10 @@ static void mmc_pwrseq_simple_power_off(struct mmc_host *host)

	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) {
		clk_disable_unprepare(pwrseq->ext_clk);
		pwrseq->clk_enabled = false;
@@ -119,6 +124,8 @@ static int mmc_pwrseq_simple_probe(struct platform_device *pdev)

	device_property_read_u32(dev, "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.ops = &mmc_pwrseq_simple_ops;