static void dcg2900_exit(struct cg2900_chip_dev *dev) { struct dcg2900_info *info = dev->b_data; if (machine_is_snowball()) { /* Turn off power if we have any */ if (info->regulator_wlan) { regulator_disable(info->regulator_wlan); regulator_put(info->regulator_wlan); } } if (cpu_is_u5500()) dcg2900_u5500_disable_chip(dev); else dcg2900_u8500_disable_chip(dev); if (info->bt_gpio != -1) gpio_free(info->bt_gpio); if (info->pmuen_gpio != -1) gpio_free(info->pmuen_gpio); if (info->gbf_gpio != -1) gpio_free(info->gbf_gpio); kfree(info); dev->b_data = NULL; }
static void __init mop500_init_machine(void) { int i2c0_devs; /* * The HREFv60 board removed a GPIO expander and routed * all these GPIO pins to the internal GPIO controller * instead. */ if (!machine_is_snowball()) { if (machine_is_hrefv60()) mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO; else mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR; } u8500_init_devices(); mop500_pins_init(); if (machine_is_snowball()) platform_add_devices(snowball_platform_devs, ARRAY_SIZE(snowball_platform_devs)); else platform_add_devices(mop500_platform_devs, ARRAY_SIZE(mop500_platform_devs)); mop500_i2c_init(); mop500_sdi_init(); mop500_spi_init(); mop500_uart_init(); i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices); if (machine_is_hrefv60()) i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES; i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs); i2c_register_board_info(2, mop500_i2c2_devices, ARRAY_SIZE(mop500_i2c2_devices)); /* This board has full regulator constraints */ regulator_has_full_constraints(); }
void __init mop500_pins_init(void) { nmk_config_pins(mop500_pins_common, ARRAY_SIZE(mop500_pins_common)); ux500_pins_add(mop500_runtime_pins, ARRAY_SIZE(mop500_runtime_pins)); if (machine_is_hrefv60() || machine_is_u8520() || machine_is_u9540()) ux500_pins_add(mop500_runtime_pins_v60, ARRAY_SIZE(mop500_runtime_pins_v60)); else if (machine_is_snowball()) ux500_pins_add(mop500_runtime_pins_snowball, ARRAY_SIZE(mop500_runtime_pins_snowball)); else ux500_pins_add(mop500_runtime_pins_pre_v60, ARRAY_SIZE(mop500_runtime_pins_pre_v60)); if (machine_is_hrefv60() || machine_is_u8520() || machine_is_u9540()) nmk_config_pins(mop500_pins_hrefv60, ARRAY_SIZE(mop500_pins_hrefv60)); else if (machine_is_snowball()) nmk_config_pins(snowball_pins, ARRAY_SIZE(snowball_pins)); else nmk_config_pins(mop500_pins_default, ARRAY_SIZE(mop500_pins_default)); switch (pinsfor) { case PINS_FOR_U9500: nmk_config_pins(u9500_pins, ARRAY_SIZE(u9500_pins)); break; case PINS_FOR_DEFAULT: nmk_config_pins(u8500_pins, ARRAY_SIZE(u8500_pins)); default: break; } suspend_set_pins_force_fn(mop500_pins_suspend_force, mop500_pins_suspend_force_mux); }
void __init mop500_pins_init(void) { nmk_config_pins(mop500_pins_common, ARRAY_SIZE(mop500_pins_common)); if (machine_is_hrefv60()) nmk_config_pins(mop500_pins_hrefv60, ARRAY_SIZE(mop500_pins_hrefv60)); else if (machine_is_snowball()) nmk_config_pins(snowball_pins, ARRAY_SIZE(snowball_pins)); else nmk_config_pins(mop500_pins_default, ARRAY_SIZE(mop500_pins_default)); }
void __init mop500_sdi_init(void) { /* v2 has a new version of this block that need to be forced */ u32 periphid = 0x10480180; /* sdi2 on snowball is in ATL_B mode for FSMC (LAN) */ if (!machine_is_snowball()) db8500_add_sdi2(&mop500_sdi2_data, periphid); /* On-board eMMC */ db8500_add_sdi4(&mop500_sdi4_data, periphid); if (machine_is_hrefv60() || machine_is_u8520() || machine_is_snowball() || machine_is_u9540()) { if (machine_is_hrefv60() || machine_is_u9540()) { mop500_sdi0_data.gpio_cd = HREFV60_SDMMC_CD_GPIO; sdi0_en = HREFV60_SDMMC_EN_GPIO; sdi0_vsel = HREFV60_SDMMC_1V8_3V_GPIO; } else if (machine_is_u8520()) { mop500_sdi0_data.gpio_cd = U8520_SDMMC_CD_GPIO; sdi0_en = U8520_SDMMC_EN_GPIO; sdi0_vsel = U8520_SDMMC_1V8_3V_GPIO; } else if (machine_is_snowball()) { mop500_sdi0_data.gpio_cd = SNOWBALL_SDMMC_CD_GPIO; mop500_sdi0_data.cd_invert = true; sdi0_en = SNOWBALL_SDMMC_EN_GPIO; sdi0_vsel = SNOWBALL_SDMMC_1V8_3V_GPIO; } sdi0_sdi1_configure(); } /* * On boards with the TC35892 GPIO expander, sdi0 and sdi1 will finally * be added when the TC35892 initializes and calls * mop500_sdi_tc35892_init() above. */ }
static int stm_ste_disable_ape_on_mipi60(void) { int retval; retval = nmk_config_pins_sleep(ARRAY_AND_SIZE(mop500_stm_mipi60_pins)); if (retval) STM_ERR("Failed to disable MIPI60\n"); else { if (!machine_is_snowball()) retval = nmk_config_pins( ARRAY_AND_SIZE(mop500_ske_pins)); if (retval) STM_ERR("Failed to enable SKE gpio\n"); } return retval; }
void __init mop500_stuib_init(void) { int ret; if (machine_is_hrefv60() || machine_is_u8520() || machine_is_a9500()) { tsc_plat_device.cs_pin = HREFV60_TOUCH_RST_GPIO; #ifdef CONFIG_U8500_FLASH adp1653_pdata_u8500_uib.enable_gpio = HREFV60_CAMERA_FLASH_ENABLE; #endif } else { tsc_plat_device.cs_pin = GPIO_BU21013_CS; #ifdef CONFIG_U8500_FLASH adp1653_pdata_u8500_uib.enable_gpio = GPIO_CAMERA_FLASH_ENABLE; #endif } mop500_uib_i2c_add(0, mop500_i2c0_devices_stuib, ARRAY_SIZE(mop500_i2c0_devices_stuib)); mop500_uib_i2c_add(3, u8500_i2c3_devices_stuib, ARRAY_SIZE(u8500_i2c3_devices_stuib)); if (machine_is_hrefv60() || machine_is_u8520() || machine_is_a9500()) { lsm303dlh_pdata.irq_a1 = HREFV60_ACCEL_INT1_GPIO; lsm303dlh_pdata.irq_a2 = HREFV60_ACCEL_INT2_GPIO; lsm303dlh_pdata.irq_m = HREFV60_MAGNET_DRDY_GPIO; } else if (machine_is_snowball()) { lsm303dlh_pdata.irq_a1 = SNOWBALL_ACCEL_INT1_GPIO; lsm303dlh_pdata.irq_a2 = SNOWBALL_ACCEL_INT2_GPIO; lsm303dlh_pdata.irq_m = SNOWBALL_MAGNET_DRDY_GPIO; } else { lsm303dlh_pdata.irq_a1 = GPIO_ACCEL_INT1; lsm303dlh_pdata.irq_a2 = GPIO_ACCEL_INT2; lsm303dlh_pdata.irq_m = GPIO_MAGNET_DRDY; } ret = mop500_get_acc_id(); if (ret < 0) printk(KERN_ERR " Failed to get Accelerometr chip ID\n"); else lsm303dlh_pdata.chip_id = ret; mop500_uib_i2c_add(2, mop500_i2c2_devices, ARRAY_SIZE(mop500_i2c2_devices)); }
static int dcg2900_init(struct cg2900_chip_dev *dev) { int err = 0; struct dcg2900_info *info; struct cg2900_platform_data *pdata = dev_get_platdata(dev->dev); /* First retrieve and save the resources */ info = kzalloc(sizeof(*info), GFP_KERNEL); if (!info) { dev_err(dev->dev, "Could not allocate dcg2900_info\n"); return -ENOMEM; } info->gbf_gpio = -1; info->pmuen_gpio = -1; info->bt_gpio = -1; if (!dev->pdev->num_resources) { dev_dbg(dev->dev, "No resources available\n"); goto finished; } if (cpu_is_u5500()) err = dcg2900_u5500_setup(dev, info); else err = dcg2900_u8500_setup(dev, info); if (err) goto err_handling; /* * Enable the power on snowball */ if (machine_is_snowball()) { /* Take the regulator */ if (pdata->regulator_id) { info->regulator_wlan = regulator_get(dev->dev, pdata->regulator_id); if (IS_ERR(info->regulator_wlan)) { err = PTR_ERR(info->regulator_wlan); dev_warn(dev->dev, "%s: Failed to get regulator '%s'\n", __func__, pdata->regulator_id); info->regulator_wlan = NULL; goto err_handling_free_gpios; } /* Enable it also */ err = regulator_enable(info->regulator_wlan); if (err < 0) { dev_warn(dev->dev, "%s: regulator_enable failed\n", __func__); goto err_handling_put_reg; } } else { dev_warn(dev->dev, "%s: no regulator defined for snowball.\n", __func__); } } finished: dev->b_data = info; return 0; err_handling_put_reg: regulator_put(info->regulator_wlan); err_handling_free_gpios: if (info->bt_gpio != -1) gpio_free(info->bt_gpio); if (info->pmuen_gpio != -1) gpio_free(info->pmuen_gpio); if (info->gbf_gpio != -1) gpio_free(info->gbf_gpio); err_handling: kfree(info); return err; }
static int stm_ste_connection(enum stm_connection_type con_type) { int retval = -EINVAL; /* Check if connection type has been changed */ if (con_type == stm_current_connection) return 0; if (con_type != STM_DISCONNECT) { /* Always enable MIPI34 GPIO pins */ retval = nmk_config_pins( ARRAY_AND_SIZE(mop500_stm_mipi34_pins)); if (retval) { STM_ERR("Failed to enable MIPI34\n"); goto stm_ste_connection_error; } } switch (con_type) { case STM_DEFAULT_CONNECTION: case STM_STE_MODEM_ON_MIPI34_NONE_ON_MIPI60: /* Enable altC3 on GPIO70-74 (STMMOD) & GPIO75-76 (UARTMOD) */ prcmu_enable_stm_mod_uart(); retval = stm_ste_disable_ape_on_mipi60(); break; case STM_STE_APE_ON_MIPI34_NONE_ON_MIPI60: /* Disable altC3 on GPIO70-74 (STMMOD) & GPIO75-76 (UARTMOD) */ prcmu_disable_stm_mod_uart(); retval = stm_ste_disable_ape_on_mipi60(); break; case STM_STE_MODEM_ON_MIPI34_APE_ON_MIPI60: /* Enable altC3 on GPIO70-74 (STMMOD) and GPIO75-76 (UARTMOD) */ prcmu_enable_stm_mod_uart(); /* Enable APE on MIPI60 */ if (!machine_is_snowball()) retval = nmk_config_pins_sleep(ARRAY_AND_SIZE(mop500_ske_pins)); if (retval) STM_ERR("Failed to disable SKE GPIO\n"); else { retval = nmk_config_pins( ARRAY_AND_SIZE(mop500_stm_mipi60_pins)); if (retval) STM_ERR("Failed to enable MIPI60\n"); } break; case STM_STE_MODEM_ON_MICROSD: /* Disable APE on micro SD */ retval = stm_disable_ape_microsd(); /* Enable modem on micro SD */ if (!retval) retval = stm_enable_modem_microsd(); /* Enable SD card buffer and regulator on href */ if (!retval && (stm_current_connection != STM_STE_APE_ON_MICROSD)) { enable_level_shifter_for_microsd(); enable_vaux3_for_microsd_cable(); } break; case STM_STE_APE_ON_MICROSD: /* Disable modem on micro SD */ retval = stm_disable_modem_microsd(); /* Enable ape on micro SD */ if (!retval) retval = stm_enable_ape_microsd(); /* Enable SD card buffer and regulator on href */ if (!retval && (stm_current_connection != STM_STE_MODEM_ON_MICROSD)) { enable_level_shifter_for_microsd(); enable_vaux3_for_microsd_cable(); } break; case STM_DISCONNECT: retval = nmk_config_pins_sleep( ARRAY_AND_SIZE(mop500_stm_mipi34_pins)); if (retval) STM_ERR("Failed to disable MIPI34\n"); retval = stm_ste_disable_ape_on_mipi60(); if (retval) STM_ERR("Failed to disable MIPI60\n"); retval = stm_disable_modem_microsd(); if (retval) STM_ERR("Failed to disable modem on microsd\n"); retval = stm_disable_ape_microsd(); if (retval) STM_ERR("Failed to disable ape on microsd\n"); break; default: STM_ERR("Bad connection type\n"); goto stm_ste_connection_error; } /* Disable power for microsd */ if ((stm_current_connection == STM_STE_MODEM_ON_MICROSD) || (stm_current_connection == STM_STE_APE_ON_MICROSD)) { if ((con_type != STM_STE_MODEM_ON_MICROSD) && (con_type != STM_STE_APE_ON_MICROSD)) { disable_vaux3_for_microsd_cable(); disable_level_shifter_for_microsd(); } } stm_current_connection = con_type; stm_ste_connection_error: return retval; }