Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae0c34a6 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: mdss: Add i2c mhl driver MSM8994 fluid configuration"

parents 2d2da6b7 45ea72ba
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -3,17 +3,25 @@
Required properties:
- compatible: must be "sil,sii-8620"
- reg: i2c slave address
- sil,pwr-gpio: MHL power gpio required to power sii8620
- sil,fw-wake: MHL fw wake gpio going into sii8620
- sil,reset-gpio: MHL reset gpio going into sii8620 for toggling reset pin
- sil,irq-gpio: MHL interrupt gpio coming out of sii8620
- sil,i2c_port#: Port number of i2c device
- pinctrl-0: Pin control group to be used for this controller.
- pinctrl-names: Should contain only one value - "mhl_active".

Example:
	i2c@f9923000 {
		sil,sii-8620@72 {
			compatible = "sil,sii-8620";
			reg = <0x72>;
			sil,pwr-gpio = <&pm8994_gpios 2 0>;
			sil,fw-wake = <&msm_gpio 38 0>;
			sil,reset-gpio = <&msm_gpio 58 0>;
			sil,irq-gpio = <&msm_gpio 57 0>;
			sil,i2c_port# = <1>;
			pinctrl-names = "mhl_active";
			pinctrl-0 = <&mhl_intr_active &mhl_reset_active>;
		};
	};
+108 −0
Original line number Diff line number Diff line
@@ -306,7 +306,85 @@
	qcom,cont-splash-enabled;
};

&pmx_hdmi_cec {
	qcom,num-grp-pins = <1>;
	qcom,pins = <&gp 31>;
};

&pmx_hdmi_ddc {
	qcom,num-grp-pins = <2>;
	qcom,pins = <&gp 32>, <&gp 33>;
};

&pmx_hdmi_hpd {
	qcom,num-grp-pins = <1>;
	qcom,pins = <&gp 34>;
};

&mdss_hdmi_tx {
	pinctrl-names = "hdmi_hpd_active", "hdmi_ddc_active",
				"hdmi_cec_active", "hdmi_active",
				"hdmi_sleep";
	pinctrl-0 = <&mdss_hdmi_hpd_active &mdss_hdmi_ddc_suspend
					&mdss_hdmi_cec_suspend>;
	pinctrl-1 = <&mdss_hdmi_hpd_active &mdss_hdmi_ddc_active
					&mdss_hdmi_cec_suspend>;
	pinctrl-2 = <&mdss_hdmi_hpd_active &mdss_hdmi_cec_active
					&mdss_hdmi_ddc_suspend>;
	pinctrl-3 = <&mdss_hdmi_hpd_active &mdss_hdmi_ddc_active
					&mdss_hdmi_cec_active>;
	pinctrl-4 = <&mdss_hdmi_hpd_suspend &mdss_hdmi_ddc_suspend
					&mdss_hdmi_cec_suspend>;
};

&spi_epm {
	status = "disabled";
};

&soc {

	i2c_1: i2c@f9923000 { /* BLSP2 QUP1 */
		compatible = "qcom,i2c-msm-v2";
		#address-cells = <1>;
		#size-cells = <0>;
		reg-names = "qup_phys_addr", "bam_phys_addr";
		reg = <0xf9923000 0x1000>,
			<0xf9904000 0x19000>;
		interrupt-names = "qup_irq", "bam_irq";
		interrupts = <0 95 0>, <0 238 0>;
		qcom,clk-freq-out = <100000>;
		qcom,clk-freq-in  = <19200000>;
		clock-names = "iface_clk", "core_clk";
		clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>,
		<&clock_gcc clk_gcc_blsp1_qup1_i2c_apps_clk>;

		pinctrl-names = "i2c_active", "i2c_sleep";
		pinctrl-0 = <&i2c_1_active>;
		pinctrl-1 = <&i2c_1_sleep>;
		qcom,noise-rjct-scl = <0>;
		qcom,noise-rjct-sda = <0>;
		qcom,bam-pipe-idx-cons = <12>;
		qcom,bam-pipe-idx-prod = <13>;
		qcom,master-id = <86>;
		status = "ok";

		sil,sii-8620@72 {
			status = "disabled";
			compatible = "sil,sii-8620";
			reg = <0x72>;
			ldo25-supply = <&pm8994_l25>;
			sil,pwr-gpio = <&pm8994_gpios 2 0>;
			sil,pmi9 = <&pmi8994_gpios 9 0>;
			sil,pmi10 = <&pmi8994_gpios 10 0>;
			sil,fw-wake = <&msm_gpio 38 0>;
			sil,reset-gpio = <&msm_gpio 58 0>;
			sil,irq-gpio = <&msm_gpio 57 0>;
			sil,i2c_port# = <1>;
			pinctrl-names = "mhl_active";
			pinctrl-0 = <&mhl_intr_active &mhl_reset_active>;
		};
	};

	i2c@f9924000 {
		synaptics@20 {
			compatible = "synaptics,dsx";
@@ -399,7 +477,36 @@
	};
};

&pmi8994_gpios {
	gpio@c800 { /* GPIO 9 */
		qcom,mode = <1>;	/* Digital output */
		qcom,output-type = <0>;	/* CMOS logic */
		qcom,vin-sel = <2>;	/* S4 1.8V */
		qcom,src-sel = <0>;	/* Constant */
		qcom,master-en = <1>;	/* Enable GPIO */
		status = "okay";
	};

	gpio@c900 { /* GPIO 10 */
		qcom,mode = <1>;
		qcom,output-type = <0>;
		qcom,vin-sel = <2>;
		qcom,src-sel = <0>;
		qcom,master-en = <1>;
		status = "okay";
	};
};

&pm8994_gpios {
	gpio@c100 { /* GPIO 2 */
		qcom,mode = <1>;	/* Digital output */
		qcom,output-type = <0>;	/* CMOS logic */
		qcom,vin-sel = <2>;	/* S4 1.8V */
		qcom,src-sel = <0>;	/* Constant */
		qcom,master-en = <1>;	/* Enable GPIO */
		status = "okay";
	};

	gpio@c200 { /* GPIO 3 */
		qcom,mode = <0>;
		qcom,pull = <0>;
@@ -520,6 +627,7 @@
		qcom,vin-sel = <2>;		/* S4 1.8V */
		qcom,src-sel = <0>;		/* Constant */
		qcom,master-en = <1>;		/* Enable GPIO */
		qcom,invert = <0>;
		status = "okay";
	};
};
+25 −0
Original line number Diff line number Diff line
@@ -133,6 +133,31 @@
			};
		};

		mhl_intr: mhl_intr {
			qcom,pins = <&gp 57>;
			qcom,num-grp-pins = <1>;
			qcom,pin-func = <0>;
			label = "mhl_intr";

			mhl_intr_active: mhl_intr_active {
				bias-pull-up;
				input-enable;
			};
		};

		mhl_reset: mhl_reset {
			qcom,pins = <&gp 58>;
			qcom,num-grp-pins = <1>;
			qcom,pin-func = <0>;
			label = "mhl_reset";

			mhl_reset_active: mhl_reset_active {
				drive-strength = <2>;
				bias-pull-down;
				output-low;
			};
		};

		spi_0_active {
			/* MOSI, MISO, CLK */
			qcom,pins = <&gp 0>, <&gp 1>, <&gp 3>;
+162 −22
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <linux/semaphore.h>
#include <linux/cdev.h>
#include <linux/spi/spi.h>
#include <linux/regulator/consumer.h>

#include "si_fw_macros.h"
#include "si_infoframe.h"
@@ -183,6 +184,12 @@ struct i2c_xfer_mem {
	uint8_t *block_tx_buffers;
} i2c_mem;

#ifdef MHL_GPIO_EXPANDER
static bool expander_enabled = true;
#else
static bool expander_enabled;
#endif

static int gpio_expander_transfer(u8 offset, u16 count, u8 *values, bool write);

#if defined(SIMG_USE_DTS)
@@ -218,7 +225,7 @@ bool input_dev_ucp = 1;
bool input_dev_rbp = 1;
#endif
int hdcp_content_type;
bool use_spi;		 /* Default to i2c (0). */
bool use_spi = 0;		 /* Default to i2c (0). */
int crystal_khz = 19200; /* SiI8620 SK has 19.2MHz crystal */
int use_heartbeat;

@@ -490,9 +497,9 @@ static void toggle_reset_n(void)
static void toggle_BB_RST(int reset_period)
{
	MHL_TX_DBG_INFO("Toggle BB_RST# pin. Resets GPIO expander AND 8620\n");
	gpio_set_value(GPIO_BB_RESET, 0);
	gpio_set_value(starter_kit_control_gpios[MHL_RESET_INDEX].gpio, 0);
	msleep(reset_period);
	gpio_set_value(GPIO_BB_RESET, 1);
	gpio_set_value(starter_kit_control_gpios[MHL_RESET_INDEX].gpio, 1);

}

@@ -545,13 +552,15 @@ void set_pin_impl(int pin_idx, int value,
		case GET_FROM_MODULE_PARAM:
			break;
		case GPIO_ON_EXPANDER:
			bank_value =
			    *(platform_signals[pin_idx].gpio_bank_value);
			if (expander_enabled) {
				bank_value = *(platform_signals[pin_idx]
							.gpio_bank_value);
				if (value)
					bank_value |= platform_signals[pin_idx].
						gpio_mask_PCA950x;
				else
				bank_value &= ~platform_signals[pin_idx].
					bank_value &=
						~platform_signals[pin_idx].
							gpio_mask_PCA950x;

				*(platform_signals[pin_idx].gpio_bank_value) =
@@ -562,6 +571,9 @@ void set_pin_impl(int pin_idx, int value,
					       platform_signals[pin_idx].
					       gpio_reg_PCA950x.offset,
					       bank_value);
			} else {
				bank_value = 0;
			}
			break;
		default:
			gpio_set_value(platform_signals[pin_idx].gpio_number,
@@ -574,7 +586,10 @@ void set_pin_impl(int pin_idx, int value,
void platform_mhl_tx_hw_reset(uint32_t reset_period, uint32_t reset_delay)
{
	/* then reset the chip */
	if (expander_enabled)
		toggle_reset_n();
	else
		toggle_BB_RST(100);

	if (reset_delay)
		msleep(reset_delay);
@@ -1398,7 +1413,10 @@ static int __devinit starter_kit_init(void)
		pr_err("%s(): gpio_request_array failed, error code %d\n",
			__func__, ret);
	} else {
		if (expander_enabled)
			ret = gpio_expander_init();
		else
			toggle_BB_RST(100);
		if (ret != 0) {
			gpio_free_array(starter_kit_control_gpios,
				ARRAY_SIZE(starter_kit_control_gpios));
@@ -1412,10 +1430,131 @@ static int si_8620_parse_dt(struct device *dev)
{
	struct device_node *np = dev->of_node;
	int value;
	int pmi_gpio9;
	int pmi_gpio10;
	int pm_gpio2;
	int fw_wake;
	int rc = 0;
	struct pinctrl *pinctrl;
	struct pinctrl_state *active_state;
	struct regulator *ldo;

	pinctrl = devm_pinctrl_get(dev);
	if (IS_ERR_OR_NULL(pinctrl)) {
		MHL_TX_DBG_ERR("%s: failed to get pinctrl\n", __func__);
		rc = -ENODEV;
		goto dt_exit;
	}

	active_state = pinctrl_lookup_state(pinctrl, "mhl_active");
	if (IS_ERR_OR_NULL(active_state)) {
		MHL_TX_DBG_ERR("%s: failed to find mhl_active state\n",
								__func__);
		rc = -ENODEV;
		goto dt_exit;
	}

	if (pinctrl_select_state(pinctrl, active_state)) {
		MHL_TX_DBG_ERR("%s: failed to select mhl active state\n",
								__func__);
	}

	ldo = devm_regulator_get(dev, "ldo25");
	if (IS_ERR_OR_NULL(ldo)) {
		MHL_TX_DBG_ERR("%s: Unable to get regulator\n", __func__);
		rc = -ENODEV;
		goto dt_exit;
	}

	rc = regulator_set_voltage(ldo, 1000000, 1000000);
	if (rc) {
		MHL_TX_DBG_ERR("%s: Unable to set regulator voltage\n",
								__func__);
		goto dt_exit;
	}

	rc = regulator_enable(ldo);
	if (rc) {
		MHL_TX_DBG_ERR("%s: Regulator enable failed\n", __func__);
		goto dt_exit;
	}

	pm_gpio2 = of_get_named_gpio(np, "sil,pwr-gpio", 0);
	pmi_gpio9 = of_get_named_gpio(np, "sil,pmi9", 0);
	pmi_gpio10 = of_get_named_gpio(np, "sil,pmi10", 0);
	fw_wake = of_get_named_gpio(np, "sil,fw-wake", 0);

	if (gpio_is_valid(pmi_gpio9)) {
		rc = gpio_request(pmi_gpio9, "mhl_pmi9");
		if (rc) {
			MHL_TX_DBG_ERR("%s:power_gpio=[%d] req failed:\n",
				__func__, pmi_gpio9);
			goto dt_exit;
		}
		gpio_direction_output(pmi_gpio9, 0);
		gpio_set_value(pmi_gpio9, 1);
	} else {
		MHL_TX_DBG_ERR("%s:power_gpio=[%d] invalid\n",
				__func__, pmi_gpio9);
		rc = pmi_gpio9;
		goto dt_exit;
	}

	if (gpio_is_valid(pmi_gpio10)) {
		rc = gpio_request(pmi_gpio10, "mhl_pmi10");
		if (rc) {
			MHL_TX_DBG_ERR("%s:power_gpio=[%d] req failed:\n",
				__func__, pmi_gpio10);
			goto dt_exit;
		}
		gpio_direction_output(pmi_gpio10, 0);
		gpio_set_value(pmi_gpio10, 1);
	} else {
		MHL_TX_DBG_ERR("%s:power_gpio=[%d] invalid\n",
				__func__, pmi_gpio10);
		rc = pmi_gpio10;
		goto dt_exit;
	}

	if (gpio_is_valid(pm_gpio2)) {
		rc = gpio_request(pm_gpio2, "mhl_pm2");
		if (rc) {
			MHL_TX_DBG_ERR("%s:power_gpio=[%d] req failed:\n",
				__func__, pm_gpio2);
			goto dt_exit;
		}
		gpio_direction_output(pm_gpio2, 0);
		gpio_set_value(pm_gpio2, 0);
	} else {
		MHL_TX_DBG_ERR("%s:power_gpio=[%d] invalid\n",
				__func__, pm_gpio2);
		rc = pm_gpio2;
		goto dt_exit;
	}

	if (gpio_is_valid(fw_wake)) {
		rc = gpio_request(fw_wake, "mhl_fw");
		if (rc) {
			MHL_TX_DBG_ERR("%s:wake_gpio=[%d] req failed:\n",
				__func__, fw_wake);
			return rc;
		}
		gpio_direction_output(fw_wake, 0);
		gpio_set_value(fw_wake, 1);
		platform_signals[TX_FW_WAKE].gpio_number = fw_wake;
	} else {
		MHL_TX_DBG_ERR("%s:wake_gpio=[%d] invalid\n",
				__func__, fw_wake);
		rc = fw_wake;
		goto dt_exit;
	}

	value = of_get_named_gpio_flags(np, "sil,reset-gpio", 0, NULL);
	if (value >= 0)
	if (value >= 0) {
		starter_kit_control_gpios[MHL_RESET_INDEX].gpio = value;
		gpio_set_value(starter_kit_control_gpios[MHL_RESET_INDEX].gpio,
									1);
	}

	value = of_get_named_gpio_flags(np, "sil,irq-gpio", 0, NULL);
	if (value >= 0)
@@ -1429,15 +1568,16 @@ static int si_8620_parse_dt(struct device *dev)
		i2c_adapter_num = value;

	MHL_TX_DBG_INFO("Resources assigned to driver...\n");
	MHL_TX_DBG_ERR("    Reset GPIO = %d\n",
	MHL_TX_DBG_INFO("    Reset GPIO = %d\n",
			starter_kit_control_gpios[MHL_RESET_INDEX].gpio);
	MHL_TX_DBG_ERR("    Interrupt GPIO = %d\n",
	MHL_TX_DBG_INFO("    Interrupt GPIO = %d\n",
			starter_kit_control_gpios[MHL_INT_INDEX].gpio);
	MHL_TX_DBG_ERR("    I2C adapter = %d\n", i2c_adapter_num);
	MHL_TX_DBG_INFO("    I2C adapter = %d\n", i2c_adapter_num);
	if (use_spi)
		MHL_TX_DBG_ERR("    SPI adapter = %d\n", spi_bus_num);

	return 0;
dt_exit:
	return rc;
}
#endif

+1 −1
Original line number Diff line number Diff line
@@ -6654,7 +6654,7 @@ int si_mhl_tx_chip_initialize(struct drv_hw_context *hw_context)
	int status = -1;

	hw_context->pp_16bpp_override = pp_16bpp_automatic;
	set_pin(TX_FW_WAKE, 0);	/* inverter on board */
	set_pin(TX_FW_WAKE, 1);	/* inverter on board */
	platform_mhl_tx_hw_reset(TX_HW_RESET_PERIOD, TX_HW_RESET_DELAY);

	/* Power up the device. Keep HSIC and Rx cores powered down. */