int fimc_is_af_i2c_write(struct i2c_client *client ,u16 addr, u16 data) { int retries = I2C_RETRY_COUNT; int ret = 0, err = 0; u8 buf[4] = {0,}; struct i2c_msg msg = { .addr = client->addr, .flags = 0, .len = 4, .buf = buf, }; buf[0] = addr >> 8; buf[1] = addr; buf[2] = data >> 8; buf[3] = data & 0xff; #if 0 pr_info("%s : W(0x%02X%02X%02X%02X)\n",__func__, buf[0], buf[1], buf[2], buf[3]); #endif do { ret = i2c_transfer(client->adapter, &msg, 1); if (likely(ret == 1)) break; usleep_range(10000,11000); err = ret; } while (--retries > 0); /* Retry occured */ if (unlikely(retries < I2C_RETRY_COUNT)) { err("i2c_write: error %d, write (%04X, %04X), retry %d\n", err, addr, data, I2C_RETRY_COUNT - retries); } if (unlikely(ret != 1)) { err("I2C does not work\n\n"); return -EIO; } return 0; } int fimc_is_af_ldo_enable(char *name, bool on) { struct regulator *regulator = NULL; int ret = 0; regulator = regulator_get(NULL, name); if (IS_ERR_OR_NULL(regulator)) { err("%s : regulator_get(%s) fail\n", __func__, name); return -EINVAL; } if (on) { if (regulator_is_enabled(regulator)) { pr_info("%s: regulator is already enabled\n", name); goto exit; } ret = regulator_enable(regulator); if (ret) { err("%s : regulator_enable(%s) fail\n", __func__, name); goto exit; } } else { if (!regulator_is_enabled(regulator)) { pr_info("%s: regulator is already disabled\n", name); goto exit; } ret = regulator_disable(regulator); if (ret) { err("%s : regulator_disable(%s) fail\n", __func__, name); goto exit; } } exit: if (regulator) regulator_put(regulator); return ret; } int fimc_is_af_power(bool onoff) { int ret = 0; ret = fimc_is_af_ldo_enable("CAM_AF_2.8V_AP", onoff); if (ret) { err("failed to power control CAM_AF_2.8V_AP, onoff = %d", onoff); return -EINVAL; } ret = fimc_is_af_ldo_enable("CAM_IO_1.8V_AP", onoff); if (ret) { err("failed to power control CAM_IO_1.8V_AP, onoff = %d", onoff); return -EINVAL; } return ret; }
int fimc_is_af_i2c_write(struct i2c_client *client ,u8 addr, u8 data) { int retries = I2C_RETRY_COUNT; int ret = 0, err = 0; u8 buf[2] = {0,}; struct i2c_msg msg = { .addr = client->addr, .flags = 0, .len = 2, .buf = buf, }; buf[0] = addr; buf[1] = data; #if 0 pr_info("%s : W(0x%02X%02X)\n",__func__, buf[0], buf[1]); #endif do { ret = i2c_transfer(client->adapter, &msg, 1); if (likely(ret == 1)) break; usleep_range(10000,11000); err = ret; } while (--retries > 0); /* Retry occured */ if (unlikely(retries < I2C_RETRY_COUNT)) { err("i2c_write: error %d, write (%02X, %02X), retry %d\n", err, addr, data, I2C_RETRY_COUNT - retries); } if (unlikely(ret != 1)) { err("I2C does not work\n\n"); return -EIO; } return 0; } int fimc_is_af_ldo_enable(char *name, bool on) { struct fimc_is_core *core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev); struct regulator *regulator = NULL; struct platform_device *pdev = NULL; int ret = 0; BUG_ON(!core); BUG_ON(!core->pdev); pdev = core->pdev; regulator = regulator_get(&pdev->dev, name); if (IS_ERR_OR_NULL(regulator)) { err("%s : regulator_get(%s) fail\n", __func__, name); regulator_put(regulator); return -EINVAL; } if (on) { if (regulator_is_enabled(regulator)) { pr_info("%s: regulator is already enabled\n", name); goto exit; } ret = regulator_enable(regulator); if (ret) { err("%s : regulator_enable(%s) fail\n", __func__, name); goto exit; } } else { if (!regulator_is_enabled(regulator)) { pr_info("%s: regulator is already disabled\n", name); goto exit; } ret = regulator_disable(regulator); if (ret) { err("%s : regulator_disable(%s) fail\n", __func__, name); goto exit; } } exit: regulator_put(regulator); return ret; } int fimc_is_af_power(struct fimc_is_device_af *af_device, bool onoff) { int ret = 0; /*CAM_AF_2.8V_AP*/ ret = fimc_is_af_ldo_enable("CAM_AF_2.8V_AP", onoff); if (ret) { err("failed to power control CAM_AF_2.8V_AP, onoff = %d", onoff); return -EINVAL; } #ifdef CONFIG_OIS_USE /* OIS_VDD_2.8V */ ret = fimc_is_af_ldo_enable("OIS_VDD_2.8V", onoff); if (ret) { err("failed to power control OIS_VDD_2.8V, onoff = %d", onoff); return -EINVAL; } /* OIS_VM_2.8V */ ret = fimc_is_af_ldo_enable("OIS_VM_2.8V", onoff); if (ret) { err("failed to power control OIS_VM_2.8V, onoff = %d", onoff); return -EINVAL; } #endif /*CAM_IO_1.8V_AP*/ ret = fimc_is_af_ldo_enable("CAM_IO_1.8V_AP", onoff); if (ret) { err("failed to power control CAM_IO_1.8V_AP, onoff = %d", onoff); return -EINVAL; } usleep_range(5000,5000); return ret; }