static int fimc_is_ois_i2c_config(struct i2c_client *client, bool onoff) { struct pinctrl *pinctrl_i2c = NULL; struct device *i2c_dev = NULL; struct fimc_is_device_ois *ois_device; struct fimc_is_ois_gpio *gpio; if (!client) { pr_info("%s: client is null\n", __func__); return -ENODEV; } i2c_dev = client->dev.parent->parent; ois_device = i2c_get_clientdata(client); gpio = &ois_device->gpio; if (ois_device->ois_hsi2c_status != onoff) { info("%s : ois_hsi2c_stauts(%d),onoff(%d), use_i2c_pinctrl(%d)\n", __func__, ois_device->ois_hsi2c_status, onoff, gpio->use_i2c_pinctrl); if (onoff) { if(gpio->use_i2c_pinctrl) { pin_config_set(gpio->pinname, gpio->sda, PINCFG_PACK(PINCFG_TYPE_FUNC, gpio->pinfunc_on)); pin_config_set(gpio->pinname, gpio->scl, PINCFG_PACK(PINCFG_TYPE_FUNC, gpio->pinfunc_on)); } pinctrl_i2c = devm_pinctrl_get_select(i2c_dev, "on_i2c"); if (IS_ERR_OR_NULL(pinctrl_i2c)) { printk(KERN_ERR "%s: Failed to configure i2c pin\n", __func__); } else { devm_pinctrl_put(pinctrl_i2c); } } else { pinctrl_i2c = devm_pinctrl_get_select(i2c_dev, "off_i2c"); if (IS_ERR_OR_NULL(pinctrl_i2c)) { printk(KERN_ERR "%s: Failed to configure i2c pin\n", __func__); } else { devm_pinctrl_put(pinctrl_i2c); } if(gpio->use_i2c_pinctrl) { pin_config_set(gpio->pinname, gpio->sda, PINCFG_PACK(PINCFG_TYPE_FUNC, gpio->pinfunc_off)); pin_config_set(gpio->pinname, gpio->scl, PINCFG_PACK(PINCFG_TYPE_FUNC, gpio->pinfunc_off)); } } ois_device->ois_hsi2c_status = onoff; } return 0; }
static void fimc_is_ois_i2c_config(struct i2c_client *client, bool onoff) { struct pinctrl *pinctrl_i2c = NULL; struct device *i2c_dev = client->dev.parent->parent; struct fimc_is_device_ois *ois_device = i2c_get_clientdata(client); if (ois_device->ois_hsi2c_status != onoff) { info("%s : ois_hsi2c_stauts(%d),onoff(%d)\n",__func__, ois_device->ois_hsi2c_status, onoff); if (onoff) { pin_config_set(FIMC_IS_SPI_PINNAME, "gpc2-2", PINCFG_PACK(PINCFG_TYPE_FUNC, 0)); pin_config_set(FIMC_IS_SPI_PINNAME, "gpc2-3", PINCFG_PACK(PINCFG_TYPE_FUNC, 0)); pinctrl_i2c = devm_pinctrl_get_select(i2c_dev, "on_i2c"); if (IS_ERR_OR_NULL(pinctrl_i2c)) { printk(KERN_ERR "%s: Failed to configure i2c pin\n", __func__); } else { devm_pinctrl_put(pinctrl_i2c); } } else { pinctrl_i2c = devm_pinctrl_get_select(i2c_dev, "off_i2c"); if (IS_ERR_OR_NULL(pinctrl_i2c)) { printk(KERN_ERR "%s: Failed to configure i2c pin\n", __func__); } else { devm_pinctrl_put(pinctrl_i2c); } pin_config_set(FIMC_IS_SPI_PINNAME, "gpc2-2", PINCFG_PACK(PINCFG_TYPE_FUNC, 2)); pin_config_set(FIMC_IS_SPI_PINNAME, "gpc2-3", PINCFG_PACK(PINCFG_TYPE_FUNC, 2)); } ois_device->ois_hsi2c_status = onoff; } }
int fimc_is_companion_open(struct fimc_is_device_companion *device) { int ret = 0; struct fimc_is_core *core; /* Workaround for Host to use ISP-SPI. Will be removed later.*/ struct fimc_is_spi_gpio *spi_gpio; static char companion_fw_name[100]; static char master_setf_name[100]; static char mode_setf_name[100]; static char fw_name[100]; static char setf_name[100]; BUG_ON(!device); core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev); spi_gpio = &core->spi_gpio; if (test_bit(FIMC_IS_COMPANION_OPEN, &device->state)) { err("already open"); ret = -EMFILE; goto p_err; } device->companion_status = FIMC_IS_COMPANION_OPENNING; #if defined(CONFIG_PM_RUNTIME) pm_runtime_get_sync(&device->pdev->dev); #endif ret = fimc_is_sec_fw_sel(core, &device->pdev->dev, fw_name, setf_name, 0); if (ret < 0) { err("failed to select firmware (%d)", ret); goto p_err; } ret = fimc_is_sec_concord_fw_sel(core, &device->pdev->dev, companion_fw_name, master_setf_name, mode_setf_name, 0); /* TODO: loading firmware */ fimc_is_s_int_comb_isp(core, false, INTMR2_INTMCIS22); // Workaround for Host to use ISP-SPI. Will be removed later. /* set pin output for Host to use SPI*/ pin_config_set(FIMC_IS_SPI_PINNAME, spi_gpio->spi_ssn, PINCFG_PACK(PINCFG_TYPE_FUNC, FUNC_OUTPUT)); fimc_is_set_spi_config(spi_gpio, FIMC_IS_SPI_FUNC, false); if (fimc_is_comp_is_valid(core) == 0) { ret = fimc_is_comp_loadfirm(core); if (ret) { err("fimc_is_comp_loadfirm() fail"); goto p_err; } ret = fimc_is_comp_loadcal(core); if (ret) { err("fimc_is_comp_loadcal() fail"); } if(core->fan53555_client != NULL) fimc_is_power_binning(core); ret = fimc_is_comp_loadsetf(core); if (ret) { err("fimc_is_comp_loadsetf() fail"); goto p_err; } } // Workaround for Host to use ISP-SPI. Will be removed later. /* Set SPI pins to low before changing pin function */ pin_config_set(FIMC_IS_SPI_PINNAME, spi_gpio->spi_sclk, PINCFG_PACK(PINCFG_TYPE_DAT, 0)); pin_config_set(FIMC_IS_SPI_PINNAME, spi_gpio->spi_ssn, PINCFG_PACK(PINCFG_TYPE_DAT, 0)); pin_config_set(FIMC_IS_SPI_PINNAME, spi_gpio->spi_miso, PINCFG_PACK(PINCFG_TYPE_DAT, 0)); pin_config_set(FIMC_IS_SPI_PINNAME, spi_gpio->spi_mois, PINCFG_PACK(PINCFG_TYPE_DAT, 0)); /* Set pin function for A5 to use SPI */ pin_config_set(FIMC_IS_SPI_PINNAME, spi_gpio->spi_ssn, PINCFG_PACK(PINCFG_TYPE_FUNC, 2)); set_bit(FIMC_IS_COMPANION_OPEN, &device->state); device->companion_status = FIMC_IS_COMPANION_OPENDONE; fimc_is_companion_wakeup(device); p_err: info("[COMP:D] %s(%d)status(%d)\n", __func__, ret,device->companion_status); return ret; }