static int drmem_update_dt_v1(struct device_node *memory, struct property *prop) { struct property *new_prop; struct of_drconf_cell_v1 *dr_cell; struct drmem_lmb *lmb; u32 *p; new_prop = clone_property(prop, prop->length); if (!new_prop) return -1; p = new_prop->value; *p++ = cpu_to_be32(drmem_info->n_lmbs); dr_cell = (struct of_drconf_cell_v1 *)p; for_each_drmem_lmb(lmb) { dr_cell->base_addr = cpu_to_be64(lmb->base_addr); dr_cell->drc_index = cpu_to_be32(lmb->drc_index); dr_cell->aa_index = cpu_to_be32(lmb->aa_index); dr_cell->flags = cpu_to_be32(drmem_lmb_flags(lmb)); dr_cell++; } of_update_property(memory, new_prop); return 0; }
static void __init update_local_mac(struct device_node *node) { struct property *newmac; const u8* macaddr; int prop_len; macaddr = of_get_property(node, "local-mac-address", &prop_len); if (macaddr == NULL || prop_len != MAC_LEN) return; newmac = kzalloc(sizeof(*newmac) + MAC_LEN, GFP_KERNEL); if (newmac == NULL) return; newmac->value = newmac + 1; newmac->length = MAC_LEN; newmac->name = kstrdup("local-mac-address", GFP_KERNEL); if (newmac->name == NULL) { kfree(newmac); return; } memcpy(newmac->value, macaddr, MAC_LEN); ((u8*)newmac->value)[5] = (*(u32*)DIP_SWITCHES_VADDR) & 0x3f; of_update_property(node, newmac); }
static void dlpar_update_drconf_property(struct device_node *dn, struct property *prop) { struct of_drconf_cell *lmbs; u32 num_lmbs, *p; int i; /* Convert the property back to BE */ p = prop->value; num_lmbs = *p; *p = cpu_to_be32(*p); p++; lmbs = (struct of_drconf_cell *)p; for (i = 0; i < num_lmbs; i++) { lmbs[i].base_addr = cpu_to_be64(lmbs[i].base_addr); lmbs[i].drc_index = cpu_to_be32(lmbs[i].drc_index); lmbs[i].aa_index = cpu_to_be32(lmbs[i].aa_index); lmbs[i].flags = cpu_to_be32(lmbs[i].flags); } rtas_hp_event = true; of_update_property(dn, prop); rtas_hp_event = false; }
static int update_dt_property(struct device_node *dn, struct property **prop, const char *name, u32 vd, char *value) { struct property *new_prop = *prop; int more = 0; /* A negative 'vd' value indicates that only part of the new property * value is contained in the buffer and we need to call * ibm,update-properties again to get the rest of the value. * * A negative value is also the two's compliment of the actual value. */ if (vd & 0x80000000) { vd = ~vd + 1; more = 1; } if (new_prop) { /* partial property fixup */ char *new_data = kzalloc(new_prop->length + vd, GFP_KERNEL); if (!new_data) return -ENOMEM; memcpy(new_data, new_prop->value, new_prop->length); memcpy(new_data + new_prop->length, value, vd); kfree(new_prop->value); new_prop->value = new_data; new_prop->length += vd; } else { new_prop = kzalloc(sizeof(*new_prop), GFP_KERNEL); if (!new_prop) return -ENOMEM; new_prop->name = kstrdup(name, GFP_KERNEL); if (!new_prop->name) { kfree(new_prop); return -ENOMEM; } new_prop->length = vd; new_prop->value = kzalloc(new_prop->length, GFP_KERNEL); if (!new_prop->value) { kfree(new_prop->name); kfree(new_prop); return -ENOMEM; } memcpy(new_prop->value, value, vd); *prop = new_prop; } if (!more) { of_update_property(dn, new_prop); *prop = NULL; } return 0; }
static void __init tilcdc_node_disable(struct device_node *node) { struct property *prop; prop = kzalloc(sizeof(*prop), GFP_KERNEL); if (!prop) return; prop->name = "status"; prop->value = "disabled"; prop->length = strlen((char *)prop->value)+1; of_update_property(node, prop); }
static void update_gic_frequency_dt(void) { struct device_node *node; gic_frequency_dt = cpu_to_be32(gic_frequency); node = of_find_compatible_node(NULL, NULL, "mti,gic-timer"); if (!node) { pr_err("mti,gic-timer device node not found\n"); return; } if (of_update_property(node, &gic_frequency_prop) < 0) pr_err("error updating gic frequency property\n"); }
static int __init update_target_node_from_overlay( struct device_node *target, struct device_node *overlay) { struct property *prop; struct property *tprop; struct property *new_prop; int lenp = 0; int ret; for_each_property_of_node(overlay, prop) { /* Skip those we do not want to proceed */ if (!strcmp(prop->name, "name") || !strcmp(prop->name, "phandle") || !strcmp(prop->name, "linux,phandle")) continue; tprop = of_find_property(target, prop->name, &lenp); if (!tprop) { ret = of_add_property(target, prop); if (ret < 0) { pr_err("Prop %s can not be added on node %s\n", prop->name, target->full_name); return ret; } } else { new_prop = __of_copy_property(prop, GFP_KERNEL); if (!new_prop) { pr_err("Prop %s can not be duplicated\n", prop->name); return -EINVAL; } ret = of_update_property(target, new_prop); if (ret < 0) { pr_err("Prop %s can not be updated on node %s\n", prop->name, target->full_name); return ret; } } } return 0; }
static void __init update_clock_frequency(struct device_node *node) { struct property *newfreq; u32 freq; if (!of_property_read_u32(node, "clock-frequency", &freq) && freq != 0) return; newfreq = kzalloc(sizeof(*newfreq) + sizeof(u32), GFP_KERNEL); if (!newfreq) return; newfreq->value = newfreq + 1; newfreq->length = sizeof(freq); newfreq->name = kstrdup("clock-frequency", GFP_KERNEL); if (!newfreq->name) { kfree(newfreq); return; } *(u32 *)newfreq->value = cpu_to_be32(*(u32 *)XTFPGA_CLKFRQ_VADDR); of_update_property(node, newfreq); }
/* * Setup the architecture */ static void __init p1022_ds_setup_arch(void) { if (ppc_md.progress) ppc_md.progress("p1022_ds_setup_arch()", 0); #if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE) diu_ops.set_monitor_port = p1022ds_set_monitor_port; diu_ops.set_pixel_clock = p1022ds_set_pixel_clock; diu_ops.valid_monitor_port = p1022ds_valid_monitor_port; /* * Disable the NOR and NAND flash nodes if there is video=fslfb... * command-line parameter. When the DIU is active, the localbus is * unavailable, so we have to disable these nodes before the MTD * driver loads. */ if (fslfb) { struct device_node *np = of_find_compatible_node(NULL, NULL, "fsl,p1022-elbc"); if (np) { struct device_node *np2; of_node_get(np); np2 = of_find_compatible_node(np, NULL, "cfi-flash"); if (np2) { static struct property nor_status = { .name = "status", .value = "disabled", .length = sizeof("disabled"), }; /* * of_update_property() is called before * kmalloc() is available, so the 'new' object * should be allocated in the global area. * The easiest way is to do that is to * allocate one static local variable for each * call to this function. */ pr_info("p1022ds: disabling %s node", np2->full_name); of_update_property(np2, &nor_status); of_node_put(np2); } of_node_get(np); np2 = of_find_compatible_node(np, NULL, "fsl,elbc-fcm-nand"); if (np2) { static struct property nand_status = { .name = "status", .value = "disabled", .length = sizeof("disabled"), }; pr_info("p1022ds: disabling %s node", np2->full_name); of_update_property(np2, &nand_status); of_node_put(np2); } of_node_put(np); } } #endif mpc85xx_smp_init(); fsl_pci_assign_primary(); swiotlb_detect_4g(); #if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE) indirect_access_pixis_probe(); #endif pr_info("Freescale P1022 DS reference board\n"); } machine_arch_initcall(p1022_ds, mpc85xx_common_publish_devices); machine_arch_initcall(p1022_ds, swiotlb_setup_bus_notifier); /* * Called very early, device-tree isn't unflattened */ static int __init p1022_ds_probe(void) { unsigned long root = of_get_flat_dt_root(); return of_flat_dt_is_compatible(root, "fsl,p1022ds"); } define_machine(p1022_ds) { .name = "P1022 DS", .probe = p1022_ds_probe, .setup_arch = p1022_ds_setup_arch, .init_IRQ = p1022_ds_pic_init, #ifdef CONFIG_PCI .pcibios_fixup_bus = fsl_pcibios_fixup_bus, .pcibios_fixup_phb = fsl_pcibios_fixup_phb, #endif .get_irq = mpic_get_irq, .restart = fsl_rstcr_restart, .calibrate_decr = generic_calibrate_decr, .progress = udbg_progress, };
static u32 find_aa_index(struct device_node *dr_node, struct property *ala_prop, const u32 *lmb_assoc) { u32 *assoc_arrays; u32 aa_index; int aa_arrays, aa_array_entries, aa_array_sz; int i, index; /* * The ibm,associativity-lookup-arrays property is defined to be * a 32-bit value specifying the number of associativity arrays * followed by a 32-bitvalue specifying the number of entries per * array, followed by the associativity arrays. */ assoc_arrays = ala_prop->value; aa_arrays = be32_to_cpu(assoc_arrays[0]); aa_array_entries = be32_to_cpu(assoc_arrays[1]); aa_array_sz = aa_array_entries * sizeof(u32); aa_index = -1; for (i = 0; i < aa_arrays; i++) { index = (i * aa_array_entries) + 2; if (memcmp(&assoc_arrays[index], &lmb_assoc[1], aa_array_sz)) continue; aa_index = i; break; } if (aa_index == -1) { struct property *new_prop; u32 new_prop_size; new_prop_size = ala_prop->length + aa_array_sz; new_prop = dlpar_clone_property(ala_prop, new_prop_size); if (!new_prop) return -1; assoc_arrays = new_prop->value; /* increment the number of entries in the lookup array */ assoc_arrays[0] = cpu_to_be32(aa_arrays + 1); /* copy the new associativity into the lookup array */ index = aa_arrays * aa_array_entries + 2; memcpy(&assoc_arrays[index], &lmb_assoc[1], aa_array_sz); of_update_property(dr_node, new_prop); /* * The associativity lookup array index for this lmb is * number of entries - 1 since we added its associativity * to the end of the lookup array. */ aa_index = be32_to_cpu(assoc_arrays[0]) - 1; } return aa_index; }
void __init p1859_audio_init(void) { int is_e1860_b00 = tegra_is_board(NULL, "61860", NULL, "300", NULL); int modem_id = tegra_get_modem_id(); int is_e1892 = 0, i; struct device_node *np; static struct property tegra_audio_property = { .name = "platform_data", .value = &tegra_e1860_b00_pdata, .length = sizeof(tegra_e1860_b00_pdata), }; /* check the version of embedded breakout board */ is_e1892 = tegra_is_board(NULL, "61892", NULL, NULL, NULL); /* set max9485 addr as priv data for a0x and b00 */ tegra_e1860_a0x_pdata.priv_data = tegra_e1860_b00_pdata.priv_data = tegra_voice_call_pdata.priv_data = (void *)(is_e1892 ? 0x70 : 0x60); np = of_find_compatible_node(NULL, NULL, "nvidia,tegra-audio-vcm30t124"); if (NULL != np) { if (is_e1860_b00) { if (modem_id) { tegra_audio_property.value = (void *)(&tegra_voice_call_pdata); tegra_audio_property.length = sizeof(tegra_voice_call_pdata); } } else { tegra_audio_property.value = (void *)(&tegra_e1860_a0x_pdata); tegra_audio_property.length = sizeof(tegra_e1860_a0x_pdata); } of_update_property(np, &tegra_audio_property); } for (i = 0; i < ARRAY_SIZE(tegra_spdif_dit); i++) platform_device_register(&tegra_spdif_dit[i]); } void __init p1859_audio_dap_d_sel(void) { int modem_id = tegra_get_modem_id(); struct device_node *np; int gpio; if (modem_id) { np = of_find_compatible_node(NULL, NULL, "nvidia,dap-d-mux"); if (NULL != np) { gpio = of_get_named_gpio(np, "nvidia,dap-d-sel-gpio", 0); pr_info("dap-d-sel-gpio:%d\n", gpio); if (gpio_is_valid(gpio)) gpio_direction_output(gpio, 1); } } }
static void disable_serial_gpio(void) { struct device_node *np_tx, *np_rx, *np_tx_def, *np_rx_def; struct property *pp; static u32 pin_func_val; static struct property pin_func = { .name = "qcom,pin-func", .value = &pin_func_val, .length = sizeof(pin_func_val), }; static struct property output_low = { .name = "output-low", .value = NULL, .length = 0, }; static struct property bias_disable = { .name = "bias-disable", .value = NULL, .length = 0, }; np_tx = of_find_node_by_path( "/soc/pinctrl@fd510000/msm_gpio_4"); if (!np_tx) { pr_err("couldn't find msm_gpio_4 node\n"); return; } np_rx = of_find_node_by_path( "/soc/pinctrl@fd510000/msm_gpio_5"); if (!np_rx) { pr_err("couldn't find msm_gpio_5 node\n"); goto err0; } of_update_property(np_tx, &pin_func); of_update_property(np_rx, &pin_func); np_tx_def = of_find_node_by_name(np_tx, "default"); if (!np_tx_def) { pr_err("couldn't find msm_gpio_4_def node\n"); goto err1; } np_rx_def = of_find_node_by_name(np_rx, "default"); if (!np_rx_def) { pr_err("couldn't find msm_gpio_5_def node\n"); goto err2; } of_add_property(np_tx_def, &output_low); pp = of_find_property(np_rx_def, "bias-pull-up", NULL); if (pp) { of_remove_property(np_rx_def, pp); of_add_property(np_rx_def, &bias_disable); } of_add_property(np_rx_def, &output_low); of_node_put(np_rx_def); err2: of_node_put(np_tx_def); err1: of_node_put(np_rx); err0: of_node_put(np_tx); return; } static int __init init_console_setup(void) { if (need_serial_console) { pr_info("Adding %s%d as preferred console\n", CONSOLE_NAME, CONSOLE_IX); add_preferred_console(CONSOLE_NAME, CONSOLE_IX, CONSOLE_OPTIONS); } else { struct device_node *np; static struct property serial_con_status = { .name = "status", .value = "disabled", .length = sizeof("disabled"), }; np = of_find_node_by_path("/soc/serial@f991e000"); if (!np) { pr_err("couldn't find /soc/serial@f991e000 node\n"); return -EINVAL; } pr_info("disabling %s node", np->full_name); of_update_property(np, &serial_con_status); of_node_put(np); disable_serial_gpio(); } return 0; } early_initcall(init_console_setup);
static void mpu_dt_update(void) { struct device_node *np; struct board_info displayboard_info; static signed char mpu_gyro_orientation_1_95[] = { 0, 1, 0, 0, 0, 1, 1, 0, 0 }; static signed char mpu_gyro_orientation_fab0[] = { 0, -1, 0, -1, 0, 0, 0, 0, -1 }; static struct property orientation = { .name = "invensense,orientation", .value = mpu_gyro_orientation_1_95, .length = sizeof(mpu_gyro_orientation_1_95), }; np = of_find_compatible_node(NULL, NULL, "invensense,mpu6050"); if (np == NULL) { pr_err("%s: Cannot find mpu6050 node\n", __func__); return; } if (board_info.board_id == BOARD_E2549) { of_update_property(np, &orientation); } else { tegra_get_display_board_info(&displayboard_info); if (displayboard_info.fab == 0x0) { orientation.value = mpu_gyro_orientation_fab0; of_update_property(np, &orientation); } } of_node_put(np); } #endif static struct tegra_io_dpd csia_io = { .name = "CSIA", .io_dpd_reg_index = 0, .io_dpd_bit = 0, }; static struct tegra_io_dpd csib_io = { .name = "CSIB", .io_dpd_reg_index = 0, .io_dpd_bit = 1, }; static struct tegra_io_dpd csie_io = { .name = "CSIE", .io_dpd_reg_index = 1, .io_dpd_bit = 12, }; static int loki_mt9m114_power_on(struct mt9m114_power_rail *pw) { int err; if (unlikely(!pw || !pw->avdd || !pw->iovdd)) return -EFAULT; /* disable CSIA IOs DPD mode to turn on front camera for ardbeg */ tegra_io_dpd_disable(&csia_io); gpio_set_value(CAM_RSTN, 0); gpio_set_value(CAM2_PWDN, 1); usleep_range(1000, 1020); err = regulator_enable(pw->iovdd); if (unlikely(err)) goto mt9m114_iovdd_fail; err = regulator_enable(pw->avdd); if (unlikely(err)) goto mt9m114_avdd_fail; usleep_range(1000, 1020); gpio_set_value(CAM_RSTN, 1); gpio_set_value(CAM2_PWDN, 0); usleep_range(1000, 1020); /* return 1 to skip the in-driver power_on swquence */ return 1; mt9m114_avdd_fail: regulator_disable(pw->iovdd); mt9m114_iovdd_fail: gpio_set_value(CAM_RSTN, 0); /* put CSIA IOs into DPD mode to save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return -ENODEV; } static int loki_mt9m114_power_off(struct mt9m114_power_rail *pw) { if (unlikely(!pw || !pw->avdd || !pw->iovdd)) { /* put CSIA IOs into DPD mode to * save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return -EFAULT; } usleep_range(100, 120); gpio_set_value(CAM_RSTN, 0); usleep_range(100, 120); regulator_disable(pw->avdd); usleep_range(100, 120); regulator_disable(pw->iovdd); /* put CSIA IOs into DPD mode to save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return 1; } struct mt9m114_platform_data loki_mt9m114_pdata = { .power_on = loki_mt9m114_power_on, .power_off = loki_mt9m114_power_off, }; static int loki_ov7695_power_on(struct ov7695_power_rail *pw) { int err; if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd))) return -EFAULT; /* disable CSIA IOs DPD mode to turn on front camera for ardbeg */ tegra_io_dpd_disable(&csia_io); gpio_set_value(CAM2_PWDN, 0); usleep_range(1000, 1020); err = regulator_enable(pw->avdd); if (unlikely(err)) goto ov7695_avdd_fail; usleep_range(300, 320); err = regulator_enable(pw->iovdd); if (unlikely(err)) goto ov7695_iovdd_fail; usleep_range(1000, 1020); gpio_set_value(CAM2_PWDN, 1); usleep_range(1000, 1020); return 0; ov7695_iovdd_fail: regulator_disable(pw->avdd); ov7695_avdd_fail: gpio_set_value(CAM_RSTN, 0); /* put CSIA IOs into DPD mode to save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return -ENODEV; } static int loki_ov7695_power_off(struct ov7695_power_rail *pw) { if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd))) { /* put CSIA IOs into DPD mode to * save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return -EFAULT; } usleep_range(100, 120); regulator_disable(pw->iovdd); usleep_range(100, 120); regulator_disable(pw->avdd); usleep_range(100, 120); gpio_set_value(CAM2_PWDN, 0); /* put CSIA IOs into DPD mode to save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return 0; } struct ov7695_platform_data loki_ov7695_pdata = { .power_on = loki_ov7695_power_on, .power_off = loki_ov7695_power_off, }; static struct camera_data_blob loki_camera_lut[] = { {"loki_ov7695_pdata", &loki_ov7695_pdata}, {}, }; void __init loki_camera_auxdata(void *data) { struct of_dev_auxdata *aux_lut = data; while (aux_lut && aux_lut->compatible) { if (!strcmp(aux_lut->compatible, "nvidia,tegra124-camera")) { pr_info("%s: update camera lookup table.\n", __func__); aux_lut->platform_data = loki_camera_lut; } aux_lut++; } } static int loki_camera_init(void) { pr_debug("%s: ++\n", __func__); /* put CSIA/B/E IOs into DPD mode to * save additional power */ tegra_io_dpd_enable(&csia_io); tegra_io_dpd_enable(&csib_io); tegra_io_dpd_enable(&csie_io); /* Don't turn on CAM_MCLK for FFD fab a3 or higher */ if (board_info.board_id == BOARD_P2530 && board_info.fab >= 0xa3) loki_ov7695_pdata.mclk_name = "ext_mclk"; return 0; } static struct throttle_table tj_throttle_table[] = { /* CPU_THROT_LOW cannot be used by other than CPU */ /* CPU, GPU, C2BUS, C3BUS, SCLK, EMC */ { { 2295000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2269500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2244000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2218500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2193000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2167500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2142000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2116500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2091000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2065500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2040000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 2014500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1989000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1963500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1938000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1912500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1887000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1861500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1836000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1810500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1785000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1759500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1734000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1708500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1683000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1657500, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1632000, NO_CAP, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1606500, 790000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1581000, 776000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1555500, 762000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1530000, 749000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1504500, 735000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1479000, 721000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1453500, 707000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1428000, 693000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1402500, 679000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1377000, 666000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1351500, 652000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1326000, 638000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1300500, 624000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1275000, 610000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1249500, 596000, NO_CAP, NO_CAP, NO_CAP, NO_CAP } }, { { 1224000, 582000, NO_CAP, NO_CAP, NO_CAP, 792000 } }, { { 1198500, 569000, NO_CAP, NO_CAP, NO_CAP, 792000 } }, { { 1173000, 555000, NO_CAP, NO_CAP, 360000, 792000 } }, { { 1147500, 541000, NO_CAP, NO_CAP, 360000, 792000 } }, { { 1122000, 527000, NO_CAP, 684000, 360000, 792000 } }, { { 1096500, 513000, 444000, 684000, 360000, 792000 } }, { { 1071000, 499000, 444000, 684000, 360000, 792000 } }, { { 1045500, 486000, 444000, 684000, 360000, 792000 } }, { { 1020000, 472000, 444000, 684000, 324000, 792000 } }, { { 994500, 458000, 444000, 684000, 324000, 792000 } }, { { 969000, 444000, 444000, 600000, 324000, 792000 } }, { { 943500, 430000, 444000, 600000, 324000, 792000 } }, { { 918000, 416000, 396000, 600000, 324000, 792000 } }, { { 892500, 402000, 396000, 600000, 324000, 792000 } }, { { 867000, 389000, 396000, 600000, 324000, 792000 } }, { { 841500, 375000, 396000, 600000, 288000, 792000 } }, { { 816000, 361000, 396000, 600000, 288000, 792000 } }, { { 790500, 347000, 396000, 600000, 288000, 792000 } }, { { 765000, 333000, 396000, 504000, 288000, 792000 } }, { { 739500, 319000, 348000, 504000, 288000, 792000 } }, { { 714000, 306000, 348000, 504000, 288000, 624000 } }, { { 688500, 292000, 348000, 504000, 288000, 624000 } }, { { 663000, 278000, 348000, 504000, 288000, 624000 } }, { { 637500, 264000, 348000, 504000, 288000, 624000 } }, { { 612000, 250000, 348000, 504000, 252000, 624000 } }, { { 586500, 236000, 348000, 504000, 252000, 624000 } }, { { 561000, 222000, 348000, 420000, 252000, 624000 } }, { { 535500, 209000, 288000, 420000, 252000, 624000 } }, { { 510000, 195000, 288000, 420000, 252000, 624000 } }, { { 484500, 181000, 288000, 420000, 252000, 624000 } }, { { 459000, 167000, 288000, 420000, 252000, 624000 } }, { { 433500, 153000, 288000, 420000, 252000, 396000 } }, { { 408000, 139000, 288000, 420000, 252000, 396000 } }, { { 382500, 126000, 288000, 420000, 252000, 396000 } }, { { 357000, 112000, 288000, 420000, 252000, 396000 } }, { { 331500, 98000, 288000, 420000, 252000, 396000 } }, { { 306000, 84000, 288000, 420000, 252000, 396000 } }, { { 280500, 84000, 288000, 420000, 252000, 396000 } }, { { 255000, 84000, 288000, 420000, 252000, 396000 } }, { { 229500, 84000, 288000, 420000, 252000, 396000 } }, { { 204000, 84000, 288000, 420000, 252000, 396000 } }, }; static struct balanced_throttle tj_throttle = { .throt_tab_size = ARRAY_SIZE(tj_throttle_table), .throt_tab = tj_throttle_table, }; static int __init loki_throttle_init(void) { if (of_machine_is_compatible("nvidia,loki") || of_machine_is_compatible("nvidia,t132loki")) balanced_throttle_register(&tj_throttle, "tegra-balanced"); return 0; } module_init(loki_throttle_init); static int loki_fan_est_match(struct thermal_zone_device *thz, void *data) { return (strcmp((char *)data, thz->type) == 0); } static int loki_fan_est_get_temp(void *data, long *temp) { struct thermal_zone_device *thz; thz = thermal_zone_device_find(data, loki_fan_est_match); if (!thz || thz->ops->get_temp(thz, temp)) *temp = 25000; return 0; } static struct thermal_zone_params fan_tzp = { .governor_name = "pid_thermal_gov", }; static int active_trip_temps_loki[] = {0, 60000, 68000, 79000, 90000, 140000, 150000, 160000, 170000, 180000}; static int active_hysteresis_loki[] = {0, 20000, 7000, 10000, 10000, 0, 0, 0, 0, 0}; static int active_trip_temps_foster[] = {0, 63000, 74000, 85000, 120000, 140000, 150000, 160000, 170000, 180000}; static int active_hysteresis_foster[] = {0, 15000, 11000, 6000, 4000, 0, 0, 0, 0, 0}; /*Fan thermal estimator data for P2548*/ static struct therm_fan_est_data fan_est_data = { .toffset = 0, .polling_period = 1100, .ndevs = 2, .devs = { { .dev_data = "CPU-therm", .get_temp = loki_fan_est_get_temp, .coeffs = { 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, { .dev_data = "GPU-therm", .get_temp = loki_fan_est_get_temp, .coeffs = { 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, }, .cdev_type = "pwm-fan",
static void mpu_dt_update(void) { struct device_node *np; struct board_info displayboard_info; static signed char mpu_gyro_orientation_1_95[] = { 0, 1, 0, 0, 0, 1, 1, 0, 0 }; static signed char mpu_gyro_orientation_fab0[] = { 0, -1, 0, -1, 0, 0, 0, 0, -1 }; static struct property orientation = { .name = "invensense,orientation", .value = mpu_gyro_orientation_1_95, .length = sizeof(mpu_gyro_orientation_1_95), }; np = of_find_compatible_node(NULL, NULL, "invensense,mpu6050"); if (np == NULL) { pr_err("%s: Cannot find mpu6050 node\n", __func__); return; } if (board_info.board_id == BOARD_E2549) { of_update_property(np, &orientation); } else { tegra_get_display_board_info(&displayboard_info); if (displayboard_info.fab == 0x0) { orientation.value = mpu_gyro_orientation_fab0; of_update_property(np, &orientation); } } of_node_put(np); } #endif static struct tegra_io_dpd csia_io = { .name = "CSIA", .io_dpd_reg_index = 0, .io_dpd_bit = 0, }; static struct tegra_io_dpd csib_io = { .name = "CSIB", .io_dpd_reg_index = 0, .io_dpd_bit = 1, }; static struct tegra_io_dpd csie_io = { .name = "CSIE", .io_dpd_reg_index = 1, .io_dpd_bit = 12, }; static int loki_mt9m114_power_on(struct mt9m114_power_rail *pw) { int err; if (unlikely(!pw || !pw->avdd || !pw->iovdd)) return -EFAULT; /* disable CSIA IOs DPD mode to turn on front camera for ardbeg */ tegra_io_dpd_disable(&csia_io); gpio_set_value(CAM_RSTN, 0); gpio_set_value(CAM2_PWDN, 1); usleep_range(1000, 1020); err = regulator_enable(pw->iovdd); if (unlikely(err)) goto mt9m114_iovdd_fail; err = regulator_enable(pw->avdd); if (unlikely(err)) goto mt9m114_avdd_fail; usleep_range(1000, 1020); gpio_set_value(CAM_RSTN, 1); gpio_set_value(CAM2_PWDN, 0); usleep_range(1000, 1020); /* return 1 to skip the in-driver power_on swquence */ return 1; mt9m114_avdd_fail: regulator_disable(pw->iovdd); mt9m114_iovdd_fail: gpio_set_value(CAM_RSTN, 0); /* put CSIA IOs into DPD mode to save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return -ENODEV; } static int loki_mt9m114_power_off(struct mt9m114_power_rail *pw) { if (unlikely(!pw || !pw->avdd || !pw->iovdd)) { /* put CSIA IOs into DPD mode to * save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return -EFAULT; } usleep_range(100, 120); gpio_set_value(CAM_RSTN, 0); usleep_range(100, 120); regulator_disable(pw->avdd); usleep_range(100, 120); regulator_disable(pw->iovdd); /* put CSIA IOs into DPD mode to save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return 1; } struct mt9m114_platform_data loki_mt9m114_pdata = { .power_on = loki_mt9m114_power_on, .power_off = loki_mt9m114_power_off, }; static int loki_ov7695_power_on(struct ov7695_power_rail *pw) { int err; if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd))) return -EFAULT; /* disable CSIA IOs DPD mode to turn on front camera for ardbeg */ tegra_io_dpd_disable(&csia_io); gpio_set_value(CAM2_PWDN, 0); usleep_range(1000, 1020); err = regulator_enable(pw->avdd); if (unlikely(err)) goto ov7695_avdd_fail; usleep_range(300, 320); err = regulator_enable(pw->iovdd); if (unlikely(err)) goto ov7695_iovdd_fail; usleep_range(1000, 1020); gpio_set_value(CAM2_PWDN, 1); usleep_range(1000, 1020); return 0; ov7695_iovdd_fail: regulator_disable(pw->avdd); ov7695_avdd_fail: gpio_set_value(CAM_RSTN, 0); /* put CSIA IOs into DPD mode to save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return -ENODEV; } static int loki_ov7695_power_off(struct ov7695_power_rail *pw) { if (unlikely(WARN_ON(!pw || !pw->avdd || !pw->iovdd))) { /* put CSIA IOs into DPD mode to * save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return -EFAULT; } usleep_range(100, 120); regulator_disable(pw->iovdd); usleep_range(100, 120); regulator_disable(pw->avdd); usleep_range(100, 120); gpio_set_value(CAM2_PWDN, 0); /* put CSIA IOs into DPD mode to save additional power for ardbeg */ tegra_io_dpd_enable(&csia_io); return 0; } struct ov7695_platform_data loki_ov7695_pdata = { .power_on = loki_ov7695_power_on, .power_off = loki_ov7695_power_off, }; static struct i2c_board_info loki_i2c_board_info_ov7695 = { I2C_BOARD_INFO("ov7695", 0x21), .platform_data = &loki_ov7695_pdata, }; static struct camera_module loki_camera_module_info[] = { { /* front camera */ .sensor = &loki_i2c_board_info_ov7695, }, {} };
static int drmem_update_dt_v2(struct device_node *memory, struct property *prop) { struct property *new_prop; struct of_drconf_cell_v2 *dr_cell; struct drmem_lmb *lmb, *prev_lmb; u32 lmb_sets, prop_sz, seq_lmbs; u32 *p; /* First pass, determine how many LMB sets are needed. */ lmb_sets = 0; prev_lmb = NULL; for_each_drmem_lmb(lmb) { if (!prev_lmb) { prev_lmb = lmb; lmb_sets++; continue; } if (prev_lmb->aa_index != lmb->aa_index || drmem_lmb_flags(prev_lmb) != drmem_lmb_flags(lmb)) lmb_sets++; prev_lmb = lmb; } prop_sz = lmb_sets * sizeof(*dr_cell) + sizeof(__be32); new_prop = clone_property(prop, prop_sz); if (!new_prop) return -1; p = new_prop->value; *p++ = cpu_to_be32(lmb_sets); dr_cell = (struct of_drconf_cell_v2 *)p; /* Second pass, populate the LMB set data */ prev_lmb = NULL; seq_lmbs = 0; for_each_drmem_lmb(lmb) { if (prev_lmb == NULL) { /* Start of first LMB set */ prev_lmb = lmb; init_drconf_v2_cell(dr_cell, lmb); seq_lmbs++; continue; } if (prev_lmb->aa_index != lmb->aa_index || drmem_lmb_flags(prev_lmb) != drmem_lmb_flags(lmb)) { /* end of one set, start of another */ dr_cell->seq_lmbs = cpu_to_be32(seq_lmbs); dr_cell++; init_drconf_v2_cell(dr_cell, lmb); seq_lmbs = 1; } else { seq_lmbs++; } prev_lmb = lmb; } /* close out last LMB set */ dr_cell->seq_lmbs = cpu_to_be32(seq_lmbs); of_update_property(memory, new_prop); return 0; }