int __init grouper_sensors_init(void) { int err; grouper_camera_init(); #ifdef CONFIG_VIDEO_OV2710 i2c_register_board_info(2, grouper_i2c2_board_info, ARRAY_SIZE(grouper_i2c2_board_info)); #endif /* Front Camera mi1040 + */ pr_info("mi1040 i2c_register_board_info"); i2c_register_board_info(2, front_sensor_i2c2_board_info, ARRAY_SIZE(front_sensor_i2c2_board_info)); err = grouper_nct1008_init(); if (err) printk("[Error] Thermal: Configure GPIO_PCC2 as an irq fail!"); i2c_register_board_info(4, grouper_i2c4_nct1008_board_info, ARRAY_SIZE(grouper_i2c4_nct1008_board_info)); mpuirq_init(); i2c_register_board_info(2, cardhu_i2c1_board_info_al3010, ARRAY_SIZE(cardhu_i2c1_board_info_al3010)); if (GROUPER_PROJECT_BACH == grouper_get_project_id()) { i2c_register_board_info(2, cap1106_i2c1_board_info, ARRAY_SIZE(cap1106_i2c1_board_info)); } return 0; }
int __init macallan_sensors_init(void) { int err; tegra_get_board_info(&board_info); /* E1545+E1604 has no temp sensor. */ if (board_info.board_id != BOARD_E1545) { err = macallan_nct1008_init(); if (err) { pr_err("%s: nct1008 register failed.\n", __func__); return err; } } macallan_camera_init(); mpuirq_init(); i2c_register_board_info(0, macallan_i2c0_board_info_cm3217, ARRAY_SIZE(macallan_i2c0_board_info_cm3217)); i2c_register_board_info(0, bq20z45_pdata, ARRAY_SIZE(bq20z45_pdata)); return 0; }
int __init tegratab_sensors_init(void) { int err; tegra_get_board_info(&board_info); if (board_info.board_id == BOARD_E1569 || (board_info.board_id == BOARD_P1640 && (board_info.fab == BOARD_FAB_A00 || board_info.fab == BOARD_FAB_A01))) { err = tegratab_nct1008_init(); if (err) { pr_err("%s: nct1008 register failed.\n", __func__); return err; } } else { err = platform_add_devices(gadc_thermal_devices, ARRAY_SIZE(gadc_thermal_devices)); if (err) { pr_err("%s: gadc_thermal register failed\n", __func__); return err; } } tegratab_camera_init(); mpuirq_init(); return 0; }
int __init pluto_sensors_init(void) { int err; tegra_get_board_info(&board_info); pr_debug("%s: ++\n", __func__); #ifndef CONFIG_OF pluto_camera_init(); #endif err = pluto_nct1008_init(); if (err) return err; err = i2c_register_board_info(0, pluto_i2c1_isl_board_info, ARRAY_SIZE(pluto_i2c1_isl_board_info)); if (err) pr_err("%s: isl board register failed.\n", __func__); mpuirq_init(); max77665_init(); if (get_power_supply_type() == POWER_SUPPLY_TYPE_BATTERY) max17042_pdata.is_battery_present = true; err = i2c_register_board_info(0, max17042_device, ARRAY_SIZE(max17042_device)); if (err) pr_err("%s: max17042 device register failed.\n", __func__); return 0; }
int __init ventana_sensors_init(void) { struct board_info BoardInfo; ventana_isl29018_init(); #ifdef CONFIG_SENSORS_AK8975 ventana_akm8975_init(); #endif #ifdef CONFIG_MPU_SENSORS_MPU3050 mpuirq_init(); #endif // ventana_camera_init(); ventana_nct1008_init(); i2c_register_board_info(0, ventana_i2c0_board_info, ARRAY_SIZE(ventana_i2c0_board_info)); tegra_get_board_info(&BoardInfo); /* * battery driver is supported on FAB.D boards and above only, * since they have the necessary hardware rework */ i2c_register_board_info(2, ventana_i2c2_board_info, ARRAY_SIZE(ventana_i2c2_board_info)); /* Compal K1 - Carl begin */ //i2c_register_board_info(3, ventana_i2c3_board_info_ssl3250a, // ARRAY_SIZE(ventana_i2c3_board_info_ssl3250a)); i2c_register_board_info(3, ventana_i2c3_board_info, ARRAY_SIZE(ventana_i2c3_board_info)); /* Compal K1 - Carl end */ i2c_register_board_info(4, ventana_i2c4_board_info, ARRAY_SIZE(ventana_i2c4_board_info)); /* Compal K1 - Carl begin */ /* i2c_register_board_info(6, ventana_i2c6_board_info, ARRAY_SIZE(ventana_i2c6_board_info)); i2c_register_board_info(7, ventana_i2c7_board_info, ARRAY_SIZE(ventana_i2c7_board_info)); i2c_register_board_info(8, ventana_i2c8_board_info, ARRAY_SIZE(ventana_i2c8_board_info)); */ /* Compal K1 - Carl end */ return 0; }
int __init kai_sensors_init(void) { kai_camera_init(); i2c_register_board_info(2, kai_i2c2_board_info, ARRAY_SIZE(kai_i2c2_board_info)); i2c_register_board_info(0, kai_i2c0_cm3217_board_info, ARRAY_SIZE(kai_i2c0_cm3217_board_info)); mpuirq_init(); return 0; }
int __init keenhi_t40_sensors_init(void) { int err; // tegra_get_board_info(&board_info); /* NCT218 thermal sensor is only mounted on E1546 */ // if (board_info.board_id == BOARD_E1546) { err = keenhi_t40_nct1008_init(); if (err) { pr_err("%s: nct1008 register failed.\n", __func__); return err; } } keenhi_lightsensor_init(); keenhi_t40_camera_init(); #ifdef CONFIG_TORCH_LP3367 keenhi_t40_flash_init(); #endif #ifdef CONFIG_KEENHI_T40_USI_3G keenhi_t40_usi3g_gpio_init(); #endif #ifdef CONFIG_GPIO_SWITCH_SERAIL keenhi_gpio_switch(); #endif #ifdef CONFIG_MPU_SENSORS_MPU3050 mpuirq_init(); #endif #ifdef CONFIG_INPUT_KIONIX_ACCEL i2c0_board_info_kionix[0].irq = gpio_to_irq(TEGRA_GPIO_PO5); i2c_register_board_info(0, i2c0_board_info_kionix, ARRAY_SIZE(i2c0_board_info_kionix)); #endif #ifdef CONFIG_SENSORS_AKM8963 i2c0_board_info_akm8963[0].irq = gpio_to_irq(TEGRA_GPIO_PX1); i2c_register_board_info(0, i2c0_board_info_akm8963, ARRAY_SIZE(i2c0_board_info_akm8963)); #endif i2c_register_board_info(0, keenhi_t40_i2c0_board_info_cm3217, ARRAY_SIZE(keenhi_t40_i2c0_board_info_cm3217)); return 0; }
int __init ventana_sensors_init(void) { struct board_info BoardInfo; ventana_isl29018_init(); #ifdef CONFIG_SENSORS_AK8975 ventana_akm8975_init(); #endif mpuirq_init(); ventana_nct1008_init(); ventana_i2c0_board_info[0].irq = gpio_to_irq(TEGRA_GPIO_PZ2); i2c_register_board_info(0, ventana_i2c0_board_info, ARRAY_SIZE(ventana_i2c0_board_info)); tegra_get_board_info(&BoardInfo); /* * battery driver is supported on FAB.D boards and above only, * since they have the necessary hardware rework */ if (BoardInfo.sku > 0) { i2c_register_board_info(2, ventana_i2c2_board_info, ARRAY_SIZE(ventana_i2c2_board_info)); } i2c_register_board_info(3, ventana_i2c3_board_info_ssl3250a, ARRAY_SIZE(ventana_i2c3_board_info_ssl3250a)); ventana_i2c4_board_info[0].irq = gpio_to_irq(NCT1008_THERM2_GPIO); #ifdef CONFIG_SENSORS_AK8975 ventana_i2c4_board_info[1].irq = gpio_to_irq(AKM8975_IRQ_GPIO); #endif i2c_register_board_info(4, ventana_i2c4_board_info, ARRAY_SIZE(ventana_i2c4_board_info)); i2c_register_board_info(6, ventana_i2c6_board_info, ARRAY_SIZE(ventana_i2c6_board_info)); i2c_register_board_info(7, ventana_i2c7_board_info, ARRAY_SIZE(ventana_i2c7_board_info)); i2c_register_board_info(8, ventana_i2c8_board_info, ARRAY_SIZE(ventana_i2c8_board_info)); return 0; }
int __init pismo_sensors_init(void) { int err; err = pismo_nct1008_init(); if (err) return err; pismo_camera_init(); mpuirq_init(); i2c_register_board_info(0, pismo_i2c_board_info_cm3218, ARRAY_SIZE(pismo_i2c_board_info_cm3218)); i2c_register_board_info(0, bq20z45_pdata, ARRAY_SIZE(bq20z45_pdata)); return 0; }
int __init ardbeg_sensors_init(void) { struct board_info board_info; tegra_get_board_info(&board_info); /* PM363 and PM359 , PM375, PM377 don't have mpu 9250 mounted */ /* TN8 sensors use Device Tree */ if (board_info.board_id != BOARD_PM363 && board_info.board_id != BOARD_PM359 && board_info.board_id != BOARD_PM375 && board_info.board_id != BOARD_PM377 && !of_machine_is_compatible("nvidia,tn8")) mpuirq_init(); ardbeg_camera_init(); if (board_info.board_id == BOARD_P1761 || board_info.board_id == BOARD_E1784 || board_info.board_id == BOARD_E1922) { platform_add_devices(gadc_thermal_devices, ARRAY_SIZE(gadc_thermal_devices)); thermistor_table = &tn8_thermistor_table[0]; thermistor_table_size = ARRAY_SIZE(tn8_thermistor_table); } else ardbeg_nct72_init(); /* TN8 and PM359, PM375, PM377 don't have ALS CM32181 */ if (!of_machine_is_compatible("nvidia,tn8") && board_info.board_id != BOARD_PM359 && board_info.board_id != BOARD_PM375 && board_info.board_id != BOARD_PM377) i2c_register_board_info(0, ardbeg_i2c_board_info_cm32181, ARRAY_SIZE(ardbeg_i2c_board_info_cm32181)); if (get_power_supply_type() == POWER_SUPPLY_TYPE_BATTERY) i2c_register_board_info(1, bq20z45_pdata, ARRAY_SIZE(bq20z45_pdata)); return 0; }
int __init kai_sensors_init(void) { int err; err = kai_nct1008_init(); if (err) pr_err("%s: nct1008 init failed\n", __func__); else i2c_register_board_info(4, kai_i2c4_nct1008_board_info, ARRAY_SIZE(kai_i2c4_nct1008_board_info)); kai_camera_init(); i2c_register_board_info(2, kai_i2c2_board_info, ARRAY_SIZE(kai_i2c2_board_info)); i2c_register_board_info(0, kai_i2c0_cm3217_board_info, ARRAY_SIZE(kai_i2c0_cm3217_board_info)); mpuirq_init(); return 0; }
int __init macallan_sensors_init(void) { int err; tegra_get_board_info(&board_info); /* NCT218 thermal sensor is only mounted on E1546 */ if (board_info.board_id == BOARD_E1546) { err = macallan_nct1008_init(); if (err) { pr_err("%s: nct1008 register failed.\n", __func__); return err; } } macallan_camera_init(); mpuirq_init(); i2c_register_board_info(0, macallan_i2c0_board_info_cm3217, ARRAY_SIZE(macallan_i2c0_board_info_cm3217)); return 0; }
int __init loki_sensors_init(void) { tegra_get_board_info(&board_info); if (board_info.board_id == BOARD_P2530 && board_info.fab >= 0xa1) { thermistor_table = &loki_ffd_thermistor_table[0]; thermistor_table_size = ARRAY_SIZE(loki_ffd_thermistor_table); if (board_info.sku == BOARD_SKU_FOSTER) { platform_add_devices(gadc_thermal_devices_p2530_foster, ARRAY_SIZE(gadc_thermal_devices_p2530_foster)); } else if (board_info.sku == BOARD_SKU_100 || board_info.sku == BOARD_SKU_0) { tbat_thermistor_table = &loki_tbat_thermistor_table[0]; tbat_thermistor_table_size = ARRAY_SIZE(loki_tbat_thermistor_table); platform_add_devices(gadc_thermal_devices_p2530, ARRAY_SIZE(gadc_thermal_devices_p2530)); } else { pr_err("thermal: Not a known sku\n"); } } loki_fan_est_init(); if (!(board_info.board_id == BOARD_P2530 && board_info.sku == BOARD_SKU_FOSTER)) { #ifndef CONFIG_USE_OF mpuirq_init(); #else mpu_dt_update(); #endif if (board_info.board_id != BOARD_E2549) loki_camera_init(); } return 0; }
void __init lge_add_sensor_devices(void) { gpio_tlmm_config(GPIO_CFG(MPUIRQ_GPIO, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); //MPU_INT gpio_tlmm_config(GPIO_CFG(49, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); //PROX_INT gpio_tlmm_config(GPIO_CFG(44, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); //SDA gpio_tlmm_config(GPIO_CFG(45, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); //SCL /* Sensor power on */ sensor_power(1); /*MPU INT Init*/ mpuirq_init(); i2c_register_board_info(MSM_8930_GSBI12_QUP_I2C_BUS_ID,(&apds9190_i2c_bdinfo[0]), 1); i2c_register_board_info(MSM_8930_GSBI12_QUP_I2C_BUS_ID,(&akm8963_i2c_bdinfo[0]), 1); #ifdef CONFIG_MACH_LGE_FX3_VZW if(system_rev < HW_REV_B) i2c_register_board_info(MSM_8930_GSBI12_QUP_I2C_BUS_ID,(&mpu6500_i2c_bdinfo[0]), 1); else i2c_register_board_info(MSM_8930_GSBI12_QUP_I2C_BUS_ID,(&mpu6500_i2c_bdinfo[1]), 1); #else i2c_register_board_info(MSM_8930_GSBI12_QUP_I2C_BUS_ID,(&mpu6500_i2c_bdinfo[1]), 1); #endif }
int mpu_probe(struct i2c_client *client, const struct i2c_device_id *devid) { struct mpu_platform_data *pdata; struct mpu_private_data *mpu; struct mldl_cfg *mldl_cfg; int res = 0; int ii = 0; dev_info(&client->adapter->dev, "%s: %d\n", __func__, ii++); if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { res = -ENODEV; goto out_check_functionality_failed; } //[ECID:000000] ZTEBSP wanghaifei start 20120221, add sys file for sensor detect res = sysfs_create_group(&client->dev.kobj, &mpu3050_dev_attr_grp); if (res) { dev_err(&client->adapter->dev, "mpu3050 create sys file failed\n"); goto out_create_sysfs_grp; } //[ECID:000000] ZTEBSP wanghaifei end 20120221, add sys file for sensor detect mpu = kzalloc(sizeof(struct mpu_private_data), GFP_KERNEL); if (!mpu) { res = -ENOMEM; goto out_alloc_data_failed; } mldl_cfg = &mpu->mldl_cfg; mldl_cfg->mpu_ram = &mpu->mpu_ram; mldl_cfg->mpu_gyro_cfg = &mpu->mpu_gyro_cfg; mldl_cfg->mpu_offsets = &mpu->mpu_offsets; mldl_cfg->mpu_chip_info = &mpu->mpu_chip_info; mldl_cfg->inv_mpu_cfg = &mpu->inv_mpu_cfg; mldl_cfg->inv_mpu_state = &mpu->inv_mpu_state; mldl_cfg->mpu_ram->length = MPU_MEM_NUM_RAM_BANKS * MPU_MEM_BANK_SIZE; mldl_cfg->mpu_ram->ram = kzalloc(mldl_cfg->mpu_ram->length, GFP_KERNEL); if (!mldl_cfg->mpu_ram->ram) { res = -ENOMEM; goto out_alloc_ram_failed; } mpu_private_data = mpu; i2c_set_clientdata(client, mpu); mpu->client = client; init_waitqueue_head(&mpu->mpu_event_wait); mutex_init(&mpu->mutex); init_completion(&mpu->completion); mpu->response_timeout = 60; /* Seconds */ mpu->timeout.function = mpu_pm_timeout; mpu->timeout.data = (u_long) mpu; init_timer(&mpu->timeout); mpu->nb.notifier_call = mpu_pm_notifier_callback; mpu->nb.priority = 0; res = register_pm_notifier(&mpu->nb); if (res) { dev_err(&client->adapter->dev, "Unable to register pm_notifier %d\n", res); goto out_register_pm_notifier_failed; } pdata = (struct mpu_platform_data *)client->dev.platform_data; if (!pdata) { dev_WARN(&client->adapter->dev, "Missing platform data for mpu\n"); } mldl_cfg->pdata = pdata; mldl_cfg->mpu_chip_info->addr = client->addr; res = inv_mpu_open(&mpu->mldl_cfg, client->adapter, NULL, NULL, NULL); if (res) { dev_err(&client->adapter->dev, "Unable to open %s %d\n", MPU_NAME, res); res = -ENODEV; goto out_whoami_failed; } mpu->dev.minor = MISC_DYNAMIC_MINOR; mpu->dev.name = "mpu"; mpu->dev.fops = &mpu_fops; res = misc_register(&mpu->dev); if (res < 0) { dev_err(&client->adapter->dev, "ERROR: misc_register returned %d\n", res); goto out_misc_register_failed; } if (client->irq) { dev_info(&client->adapter->dev, "Installing irq using %d\n", client->irq); res = mpuirq_init(client, mldl_cfg); if (res) goto out_mpuirq_failed; } else { dev_WARN(&client->adapter->dev, "Missing %s IRQ\n", MPU_NAME); } return res; out_mpuirq_failed: misc_deregister(&mpu->dev); out_misc_register_failed: inv_mpu_close(&mpu->mldl_cfg, client->adapter, NULL, NULL, NULL); out_whoami_failed: unregister_pm_notifier(&mpu->nb); out_register_pm_notifier_failed: kfree(mldl_cfg->mpu_ram->ram); mpu_private_data = NULL; out_alloc_ram_failed: kfree(mpu); out_alloc_data_failed: //[ECID:000000] ZTEBSP wanghaifei start 20120221, don't remove sys file if failed out_create_sysfs_grp: //[ECID:000000] ZTEBSP wanghaifei end 20120221, don't remove sys file if failed out_check_functionality_failed: dev_err(&client->adapter->dev, "%s failed %d\n", __func__, res); return res; }
int mpu_probe(struct i2c_client *client, const struct i2c_device_id *devid) { struct mpu_platform_data *pdata; struct mpu_private_data *mpu; struct mldl_cfg *mldl_cfg; int res = 0; int ii = 0; dev_info(&client->adapter->dev, "%s: %d\n", __func__, ii++); if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { res = -ENODEV; goto out_check_functionality_failed; } mpu = kzalloc(sizeof(struct mpu_private_data), GFP_KERNEL); if (!mpu) { res = -ENOMEM; goto out_alloc_data_failed; } mldl_cfg = &mpu->mldl_cfg; mldl_cfg->mpu_ram = &mpu->mpu_ram; mldl_cfg->mpu_gyro_cfg = &mpu->mpu_gyro_cfg; mldl_cfg->mpu_offsets = &mpu->mpu_offsets; mldl_cfg->mpu_chip_info = &mpu->mpu_chip_info; mldl_cfg->inv_mpu_cfg = &mpu->inv_mpu_cfg; mldl_cfg->inv_mpu_state = &mpu->inv_mpu_state; mldl_cfg->mpu_ram->length = MPU_MEM_NUM_RAM_BANKS * MPU_MEM_BANK_SIZE; mldl_cfg->mpu_ram->ram = kzalloc(mldl_cfg->mpu_ram->length, GFP_KERNEL); if (!mldl_cfg->mpu_ram->ram) { res = -ENOMEM; goto out_alloc_ram_failed; } mpu_private_data = mpu; i2c_set_clientdata(client, mpu); mpu->client = client; init_waitqueue_head(&mpu->mpu_event_wait); mutex_init(&mpu->mutex); init_completion(&mpu->completion); mpu->response_timeout = 60; /* Seconds */ mpu->timeout.function = mpu_pm_timeout; mpu->timeout.data = (u_long) mpu; init_timer(&mpu->timeout); pdata = (struct mpu_platform_data *)client->dev.platform_data; if (!pdata) { dev_WARN(&client->adapter->dev, "Missing platform data for mpu\n"); } else { mldl_cfg->pdata = pdata; if (pdata && pdata->setup && pdata->hw_config) { pdata->hw_config(&client->dev, 1); /* by Spec */ usleep_range(4000, 5000); res = pdata->setup(&client->dev, 1); if (res) goto out_alloc_ram_failed; } } mldl_cfg->mpu_chip_info->addr = client->addr; res = inv_mpu_open(&mpu->mldl_cfg, client->adapter, NULL, NULL, NULL); if (res) { dev_err(&client->adapter->dev, "Unable to open %s %d\n", MPU_NAME, res); res = -ENODEV; goto out_whoami_failed; } mpu->dev.minor = MISC_DYNAMIC_MINOR; mpu->dev.name = "mpu"; mpu->dev.fops = &mpu_fops; res = misc_register(&mpu->dev); if (res < 0) { dev_err(&client->adapter->dev, "ERROR: misc_register returned %d\n", res); goto out_misc_register_failed; } if (client->irq) { dev_info(&client->adapter->dev, "Installing irq using %d\n", client->irq); res = mpuirq_init(client, mldl_cfg); if (res) goto out_mpuirq_failed; } else { dev_WARN(&client->adapter->dev, "Missing %s IRQ\n", MPU_NAME); } if (!strncmp(mpu_id[1].name, devid->name, sizeof(devid->name))) { /* Special case to re-use the inv_mpu_register_slave */ struct ext_slave_platform_data *slave_pdata; slave_pdata = kzalloc(sizeof(*slave_pdata), GFP_KERNEL); if (!slave_pdata) { res = -ENOMEM; goto out_slave_pdata_kzalloc_failed; } slave_pdata->bus = EXT_SLAVE_BUS_PRIMARY; for (ii = 0; ii < 9; ii++) slave_pdata->orientation[ii] = pdata->orientation[ii]; res = inv_mpu_register_slave( NULL, client, slave_pdata, mpu6050_get_slave_descr); if (res) { /* if inv_mpu_register_slave fails there are no pointer references to the memory allocated to slave_pdata */ kfree(slave_pdata); goto out_slave_pdata_kzalloc_failed; } } return res; out_slave_pdata_kzalloc_failed: if (client->irq) mpuirq_exit(); out_mpuirq_failed: misc_deregister(&mpu->dev); out_misc_register_failed: inv_mpu_close(&mpu->mldl_cfg, client->adapter, NULL, NULL, NULL); out_whoami_failed: unregister_pm_notifier(&mpu->nb); kfree(mldl_cfg->mpu_ram->ram); mpu_private_data = NULL; out_alloc_ram_failed: kfree(mpu); out_alloc_data_failed: out_check_functionality_failed: dev_err(&client->adapter->dev, "%s failed %d\n", __func__, res); return res; }
int __init cardhu_sensors_init(void) { int err; tegra_get_board_info(&board_info); cardhu_camera_init(); cam_tca6416_init(); i2c_register_board_info(2, cardhu_i2c3_board_info, ARRAY_SIZE(cardhu_i2c3_board_info)); i2c_register_board_info(2, cardhu_i2c_board_info_tps61050, ARRAY_SIZE(cardhu_i2c_board_info_tps61050)); #ifdef CONFIG_VIDEO_OV14810 /* This is disabled by default; To enable this change Kconfig; * there should be some way to detect dynamically which board * is connected (E1211/E1214), till that time sensor selection * logic is static; * e1214 corresponds to ov14810 sensor */ i2c_register_board_info(2, cardhu_i2c_board_info_e1214, ARRAY_SIZE(cardhu_i2c_board_info_e1214)); #else /* Left camera is on PCA954x's I2C BUS0, Right camera is on BUS1 & * Front camera is on BUS2 */ if (board_info.board_id != BOARD_PM269) { i2c_register_board_info(PCA954x_I2C_BUS0, cardhu_i2c6_board_info, ARRAY_SIZE(cardhu_i2c6_board_info)); i2c_register_board_info(PCA954x_I2C_BUS1, cardhu_i2c7_board_info, ARRAY_SIZE(cardhu_i2c7_board_info)); } else { i2c_register_board_info(PCA954x_I2C_BUS0, pm269_i2c6_board_info, ARRAY_SIZE(pm269_i2c6_board_info)); i2c_register_board_info(PCA954x_I2C_BUS1, pm269_i2c7_board_info, ARRAY_SIZE(pm269_i2c7_board_info)); } i2c_register_board_info(PCA954x_I2C_BUS2, cardhu_i2c8_board_info, ARRAY_SIZE(cardhu_i2c8_board_info)); #endif pmu_tca6416_init(); if (board_info.board_id == BOARD_E1291) i2c_register_board_info(4, cardhu_i2c4_bq27510_board_info, ARRAY_SIZE(cardhu_i2c4_bq27510_board_info)); if (board_info.sku == BOARD_SKU_B11) i2c_register_board_info(2, cardhu_i2c2_ltr_board_info, ARRAY_SIZE(cardhu_i2c2_ltr_board_info)); else i2c_register_board_info(2, cardhu_i2c2_isl_board_info, ARRAY_SIZE(cardhu_i2c2_isl_board_info)); err = cardhu_nct1008_init(); if (err) return err; i2c_register_board_info(4, cardhu_i2c4_nct1008_board_info, ARRAY_SIZE(cardhu_i2c4_nct1008_board_info)); mpuirq_init(); return 0; }
int mpu_probe(struct i2c_client *client, const struct i2c_device_id *devid) { struct mpu_platform_data *pdata; struct mpu_private_data *mpu; struct mldl_cfg *mldl_cfg; int res = 0; int ii = 0; unsigned long irq_flags; dev_info(&client->adapter->dev, "%s: %d\n", __func__, ii++); if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { res = -ENODEV; goto out_check_functionality_failed; } mpu = kzalloc(sizeof(struct mpu_private_data), GFP_KERNEL); if (!mpu) { res = -ENOMEM; goto out_alloc_data_failed; } mldl_cfg = &mpu->mldl_cfg; mldl_cfg->mpu_ram = &mpu->mpu_ram; mldl_cfg->mpu_gyro_cfg = &mpu->mpu_gyro_cfg; mldl_cfg->mpu_offsets = &mpu->mpu_offsets; mldl_cfg->mpu_chip_info = &mpu->mpu_chip_info; mldl_cfg->inv_mpu_cfg = &mpu->inv_mpu_cfg; mldl_cfg->inv_mpu_state = &mpu->inv_mpu_state; mldl_cfg->mpu_ram->length = MPU_MEM_NUM_RAM_BANKS * MPU_MEM_BANK_SIZE; mldl_cfg->mpu_ram->ram = kzalloc(mldl_cfg->mpu_ram->length, GFP_KERNEL); if (!mldl_cfg->mpu_ram->ram) { res = -ENOMEM; goto out_alloc_ram_failed; } mpu_private_data = mpu; i2c_set_clientdata(client, mpu); mpu->client = client; init_waitqueue_head(&mpu->mpu_event_wait); mutex_init(&mpu->mutex); init_completion(&mpu->completion); mpu->response_timeout = 60; /* Seconds */ mpu->timeout.function = mpu_pm_timeout; mpu->timeout.data = (u_long) mpu; init_timer(&mpu->timeout); mpu->nb.notifier_call = mpu_pm_notifier_callback; mpu->nb.priority = 0; res = register_pm_notifier(&mpu->nb); if (res) { dev_err(&client->adapter->dev, "Unable to register pm_notifier %d\n", res); goto out_register_pm_notifier_failed; } pdata = (struct mpu_platform_data *)client->dev.platform_data; if (!pdata) { dev_WARN(&client->adapter->dev, "Missing platform data for mpu\n"); } mldl_cfg->pdata = pdata; mldl_cfg->mpu_chip_info->addr = client->addr; res = inv_mpu_open(&mpu->mldl_cfg, client->adapter, NULL, NULL, NULL); if (res) { dev_err(&client->adapter->dev, "Unable to open %s %d\n", MPU_NAME, res); res = -ENODEV; goto out_whoami_failed; } mpu->dev.minor = MISC_DYNAMIC_MINOR; mpu->dev.name = "mpu"; mpu->dev.fops = &mpu_fops; res = misc_register(&mpu->dev); if (res < 0) { dev_err(&client->adapter->dev, "ERROR: misc_register returned %d\n", res); goto out_misc_register_failed; } if (client->irq) { dev_info(&client->adapter->dev, "Installing irq using %d\n", client->irq); if (BIT_ACTL_LOW == ((mldl_cfg->pdata->int_config) & BIT_ACTL)) irq_flags = IRQF_TRIGGER_FALLING; else irq_flags = IRQF_TRIGGER_RISING; res = mpuirq_init(client, mldl_cfg, irq_flags); if (res) goto out_mpuirq_failed; } else { dev_WARN(&client->adapter->dev, "Missing %s IRQ\n", MPU_NAME); } return res; out_mpuirq_failed: misc_deregister(&mpu->dev); out_misc_register_failed: inv_mpu_close(&mpu->mldl_cfg, client->adapter, NULL, NULL, NULL); out_whoami_failed: unregister_pm_notifier(&mpu->nb); out_register_pm_notifier_failed: kfree(mldl_cfg->mpu_ram->ram); mpu_private_data = NULL; out_alloc_ram_failed: kfree(mpu); out_alloc_data_failed: out_check_functionality_failed: dev_err(&client->adapter->dev, "%s failed %d\n", __func__, res); return res; }
int __init cardhu_sensors_init(void) { int err; tegra_get_board_info(&board_info); cardhu_camera_init(); cam_tca6416_init(); i2c_register_board_info(2, cardhu_i2c1_board_info_al3010, ARRAY_SIZE(cardhu_i2c1_board_info_al3010)); #ifdef CONFIG_I2C_MUX_PCA954x i2c_register_board_info(2, cardhu_i2c3_board_info, ARRAY_SIZE(cardhu_i2c3_board_info)); i2c_register_board_info(2, cardhu_i2c_board_info_tps61050, ARRAY_SIZE(cardhu_i2c_board_info_tps61050)); //#ifdef CONFIG_VIDEO_OV14810 /* This is disabled by default; To enable this change Kconfig; * there should be some way to detect dynamically which board * is connected (E1211/E1214), till that time sensor selection * logic is static; * e1214 corresponds to ov14810 sensor */ i2c_register_board_info(2, cardhu_i2c_board_info_e1214, ARRAY_SIZE(cardhu_i2c_board_info_e1214)); //#else /* Left camera is on PCA954x's I2C BUS0, Right camera is on BUS1 & * Front camera is on BUS2 */ i2c_register_board_info(PCA954x_I2C_BUS0, cardhu_i2c6_board_info, ARRAY_SIZE(cardhu_i2c6_board_info)); i2c_register_board_info(PCA954x_I2C_BUS1, cardhu_i2c7_board_info, ARRAY_SIZE(cardhu_i2c7_board_info)); i2c_register_board_info(PCA954x_I2C_BUS2, cardhu_i2c8_board_info, ARRAY_SIZE(cardhu_i2c8_board_info)); #endif //+ m6mo rear camera #ifdef CONFIG_VIDEO_YUV pr_info("fjm6mo i2c_register_board_info"); i2c_register_board_info(2, rear_sensor_i2c3_board_info, ARRAY_SIZE(rear_sensor_i2c3_board_info)); /* Front Camera mi1040 + */ pr_info("mi1040 i2c_register_board_info"); i2c_register_board_info(2, front_sensor_i2c2_board_info, ARRAY_SIZE(front_sensor_i2c2_board_info)); /* Front Camera mi1040 - */ /* Back Camera ov5640 + */ pr_info("ov5640 i2c_register_board_info"); i2c_register_board_info(2, ov5640_i2c2_board_info, ARRAY_SIZE(ov5640_i2c2_board_info)); /* Back Camera ov5640 - */ #endif /* CONFIG_VIDEO_YUV */ //- pmu_tca6416_init(); if (board_info.board_id == BOARD_E1291) i2c_register_board_info(4, cardhu_i2c4_bq27510_board_info, ARRAY_SIZE(cardhu_i2c4_bq27510_board_info)); else i2c_register_board_info(4, cardhu_i2c4_pad_bat_board_info, ARRAY_SIZE(cardhu_i2c4_pad_bat_board_info)); err = cardhu_nct1008_init(); if (err) return err; i2c_register_board_info(4, cardhu_i2c4_nct1008_board_info, ARRAY_SIZE(cardhu_i2c4_nct1008_board_info)); #ifdef CONFIG_MPU_SENSORS_MPU3050 mpuirq_init(); #endif return 0; }