static int bcm43xx_bt_rfkill_set_power(void *data, bool blocked)
{
	/* rfkill_ops callback. Turn transmitter on when blocked is false */

	if (!blocked) {
		config_pin_flis(142, PULL, UP_20K);

		usleep_range(10, 50);

		gpio_set_value(bt_lpm.gpio_wake, 1);
		/*
		* Delay advice by BRCM is min 2.5ns,
		* setting it between 10 and 50us for more confort
		*/
		usleep_range(10, 50);

		gpio_set_value(bt_lpm.gpio_enable_bt, 1);
		pr_debug("%s: turn BT on\n", __func__);
	} else {
		gpio_set_value(bt_lpm.gpio_enable_bt, 0);
		config_pin_flis(142, PULL, DOWN_20K);
		pr_debug("%s: turn BT off\n", __func__);
	}

	bt_enabled = !blocked;

	return 0;
}
static int m10mo_gpio_intr_ctrl(struct v4l2_subdev *sd)
{
#ifdef CONFIG_INTEL_SCU_FLIS
	/* This should be done in pin cfg XML and not here */
	config_pin_flis(48, PULL, DOWN_50K);
	config_pin_flis(48, MUX, MUX_EN_INPUT_EN | INPUT_EN);
#endif

	if (intr_gpio >= 0)
		return intr_gpio;

	return -EINVAL;
}
static void spi_hw_resources_setup(struct m10mo_atomisp_spi_platform_data *pdata)
{
	/* Setup SPI interface */
	if (gpio_request(pdata->spi_cs_gpio, "m10mo_spi_cs")) {
		pr_err("Can't allocate gpio for m10mo spi chip select.\n");
		pr_err("Disabling FW update over the SPI\n");
		pdata->spi_enabled = false;
		return;
	}

	cs_chip_select = pdata->spi_cs_gpio;
	lnw_gpio_set_alt(cs_chip_select, LNW_GPIO);
	gpio_direction_output(cs_chip_select, 0);
	lnw_gpio_set_alt(116, LNW_ALT_1);
	lnw_gpio_set_alt(118, LNW_ALT_1);
	lnw_gpio_set_alt(119, LNW_ALT_1);


#ifdef CONFIG_INTEL_SCU_FLIS
	/* Setup flis configuration if requested to do so */
	if (pdata->spi_clock_flis != -1)
		config_pin_flis(pdata->spi_clock_flis, MUX,
				MUX_EN_OUTPUT_EN | OUTPUT_EN);

	if (pdata->spi_dataout_flis != -1)
		config_pin_flis(pdata->spi_dataout_flis, MUX,
				MUX_EN_OUTPUT_EN | OUTPUT_EN);

	if (pdata->spi_datain_flis != -1)
		config_pin_flis(pdata->spi_datain_flis,
				MUX, MUX_EN_INPUT_EN | INPUT_EN);

	if (pdata->spi_cs_flis != -1)
		config_pin_flis(pdata->spi_cs_flis,
				MUX, MUX_EN_OUTPUT_EN | OUTPUT_EN);
#endif
}
Esempio n. 4
0
static void gpio_pull(unsigned int pud) {
	/* TODO: check for success */
	config_pin_flis(GPIO_46, PULL, pud ? UP_50K : DOWN_50K);
	config_pin_flis(GPIO_47, PULL, pud ? UP_50K : DOWN_50K);
	config_pin_flis(GPIO_48, PULL, pud ? UP_50K : DOWN_50K);
}
static int bcm43xx_bluetooth_probe(struct platform_device *pdev)
{
	bool default_state = true;	/* off */
	int ret = 0;

	int_handler_enabled = false;

#ifdef CONFIG_ACPI
	if (ACPI_HANDLE(&pdev->dev)) {
		/*
		 * acpi specific probe
		 */
		pr_debug("%s for ACPI device %s\n", __func__,
							dev_name(&pdev->dev));
		if (bcm_bt_lpm_acpi_probe(pdev) < 0)
			ret = -EINVAL;
	} else
		ret = -ENODEV;
#else
	ret = bcm43xx_bluetooth_pdata_probe(pdev);
#endif

	if (ret < 0) {
		pr_err("%s: Cannot register platform data\n", __func__);
		goto err_data_probe;
	}

	gpio_free(bt_lpm.gpio_wake);
	gpio_free(bt_lpm.gpio_host_wake);
	config_pin_flis(142, PULL, DOWN_20K);
	ret = gpio_request(bt_lpm.gpio_enable_bt, pdev->name);
	if (ret < 0) {
		pr_err("%s: Unable to request gpio %d\n", __func__,
							bt_lpm.gpio_enable_bt);
		goto err_gpio_enable_req;
	}

	ret = gpio_direction_output(bt_lpm.gpio_enable_bt, 0);
	if (ret < 0) {
		pr_err("%s: Unable to set int direction for gpio %d\n",
					__func__, bt_lpm.gpio_enable_bt);
		goto err_gpio_enable_dir;
	}

#ifdef LPM_ON
	ret = gpio_request(bt_lpm.gpio_host_wake, pdev->name);
	if (ret < 0) {
		pr_err("%s: Unable to request gpio %d\n",
					__func__, bt_lpm.gpio_host_wake);
		goto err_gpio_host_wake_req;
	}

	ret = gpio_direction_input(bt_lpm.gpio_host_wake);
	if (ret < 0) {
		pr_err("%s: Unable to set direction for gpio %d\n", __func__,
							bt_lpm.gpio_host_wake);
		goto err_gpio_host_wake_dir;
	}

	ret = gpio_request(bt_lpm.gpio_wake, pdev->name);
	if (ret < 0) {
		pr_err("%s: Unable to request gpio %d\n", __func__,
							bt_lpm.gpio_wake);
		goto err_gpio_wake_req;
	}

	ret =  gpio_direction_output(bt_lpm.gpio_wake, 0);
	if (ret < 0) {
		pr_err("%s: Unable to set direction for gpio %d\n", __func__,
							bt_lpm.gpio_wake);
		goto err_gpio_wake_dir;
	}

	pr_debug("%s: gpio_enable=%d, gpio_wake=%d, gpio_host_wake=%d\n",
							__func__,
							bt_lpm.gpio_enable_bt,
							bt_lpm.gpio_wake,
							bt_lpm.gpio_host_wake);
#endif

	bt_rfkill = rfkill_alloc("bcm43xx Bluetooth", &pdev->dev,
				RFKILL_TYPE_BLUETOOTH, &bcm43xx_bt_rfkill_ops,
				NULL);
	if (unlikely(!bt_rfkill)) {
		ret = -ENOMEM;
		goto err_rfkill_alloc;
	}

	bcm43xx_bt_rfkill_set_power(NULL, default_state);
	rfkill_init_sw_state(bt_rfkill, default_state);

	ret = rfkill_register(bt_rfkill);
	if (unlikely(ret))
		goto err_rfkill_register;

#ifdef LPM_ON
	ret = bcm_bt_lpm_init(pdev);
	if (ret)
		goto err_lpm_init;
#endif

	return ret;

err_lpm_init:
	rfkill_unregister(bt_rfkill);
err_rfkill_register:
	rfkill_destroy(bt_rfkill);
err_rfkill_alloc:
#ifdef LPM_ON
err_gpio_wake_dir:
	gpio_free(bt_lpm.gpio_wake);
err_gpio_wake_req:
err_gpio_host_wake_dir:
	gpio_free(bt_lpm.gpio_host_wake);
err_gpio_host_wake_req:
#endif
err_gpio_enable_dir:
	gpio_free(bt_lpm.gpio_enable_bt);
err_gpio_enable_req:
err_data_probe:
	return ret;
}