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 }
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; }