static int vib_of_init_default(struct vibrator *vib, int vib_nr) { vib->type = VIB_TYPE_GENENIC_ROTARY; vib->ctrl.vib_en.name = VIB_EN; vib->ctrl.vib_en.signal_type = SIGNAL_ENABLE; vib->ctrl.vib_en.of.type = SIGNAL_GPIO; vib->ctrl.vib_en.of.active_level = ACTIVE_HIGH; vib->ctrl.vib_en.of.gpio = GPIO_VIB_ENABLE; if (vib_signal_init(&vib->ctrl.vib_en)) { zfprintk("vib_en init failed\n"); return -ENODEV; } memcpy(vib->ctrl.vib_pwm,vib_pwm_config,sizeof(vib_pwm_config)); vib->ctrl.vib_dir.name = VIB_DIR; vib->ctrl.vib_dir.signal_type = SIGNAL_DIRECTION; vib->ctrl.vib_dir.of.type = SIGNAL_GPIO; vib->ctrl.vib_dir.of.active_level = ACTIVE_HIGH; vib->ctrl.vib_dir.of.gpio = GPIO_VIB_DIRECTION; if (vib_signal_init(&vib->ctrl.vib_dir)) { zfprintk("vib_dir init failed\n"); return -ENODEV; } strcpy(vib->reg.name,VIB_REGULATOR_NAME); vib->reg.volt[0].time = MAX_TIMEOUT; vib->reg.volt[0].min_uV = 2800000; vib->reg.volt[0].max_uV = 2800000; vib->min_us = MIN_TIMEOUT; vib->max_us = MAX_TIMEOUT; return 0; }
static int vib_of_init(struct vibrator *vib, int vib_nr) { struct device_node *node; const void *prop = NULL; int len = 0; char dt_path_vib[sizeof(DT_PATH_VIB) + 3]; snprintf(dt_path_vib, sizeof(DT_PATH_VIB) + 2, "%s%1d", DT_PATH_VIB, vib_nr % MAX_VIBS); node = of_find_node_by_path(dt_path_vib); if (!node) return -ENODEV; prop = of_get_property(node, DT_PROP_VIB_TYPE, &len); if (prop && len) vib->type = *((int *)prop); else return -ENODEV; if ((vib->type != VIB_TYPE_GENENIC_ROTARY) && (vib->type != VIB_TYPE_GENENIC_LINEAR)) return -ENODEV; prop = of_get_property(node, VIB_EN, &len); if (prop && len) { vib->ctrl.vib_en.of = *((struct vib_of_signal *)prop); vib->ctrl.vib_en.name = VIB_EN; vib->ctrl.vib_en.signal_type = SIGNAL_ENABLE; if (vib_signal_init(&vib->ctrl.vib_en)) { zfprintk("vib_en init failed\n"); return -ENODEV; } } else { zfprintk("vib_en not found in %s\n", dt_path_vib); return -ENODEV; } prop = of_get_property(node, "pwm", &len); if (prop && len) { int i, j = len / sizeof(struct vib_pwm); dprintk("pwm len %d size %d\n", len, len/sizeof(struct vib_pwm)); if (j > MAX_PWMS) j = MAX_PWMS; for (i = 0; i < j; i++) vib->ctrl.vib_pwm[i] = *(((struct vib_pwm *)prop) + i); } else { zfprintk("pwm not found in %s\n", dt_path_vib); return -ENODEV; } prop = of_get_property(node, VIB_DIR, &len); if (prop && len) { vib->ctrl.vib_dir.of = *((struct vib_of_signal *)prop); vib->ctrl.vib_dir.name = VIB_DIR; vib->ctrl.vib_dir.signal_type = SIGNAL_DIRECTION; if (vib_signal_init(&vib->ctrl.vib_dir)) { zfprintk("vib_dir init failed\n"); return -ENODEV; } } else { if (vib->type == VIB_TYPE_GENENIC_LINEAR) { zfprintk("vib_dir not found in %s\n", dt_path_vib); return -ENODEV; } } prop = of_get_property(node, "regulator", &len); if (prop && len) { strncpy(vib->reg.name, (char *)prop, REGULATOR_NAME_SIZE - 1); vib->reg.name[REGULATOR_NAME_SIZE - 1] = '\0'; prop = of_get_property(node, "deferred_off", &len); if (prop && len) { vib->reg.deferred_off = *(u32 *)prop; zfprintk("deferred_off %u\n", vib->reg.deferred_off); } vib->reg.volt[0].time = MAX_TIMEOUT; vib->reg.volt[0].min_uV = 2800000; vib->reg.volt[0].max_uV = 2800000; prop = of_get_property(node, "voltage", &len); if (prop && len) { int i, j = len / sizeof(struct vib_voltage); dprintk("voltage len %d size %d\n", len, len/sizeof(struct vib_voltage)); if (j > MAX_VOLT) j = MAX_VOLT; for (i = 0; i < j; i++) vib->reg.volt[i] = *(((struct vib_voltage *)prop) + i); } } prop = of_get_property(node, "min", &len); if (prop && len) vib->min_us = *((unsigned int *)prop); else vib->min_us = MIN_TIMEOUT; prop = of_get_property(node, "max", &len); if (prop && len) vib->max_us = *((unsigned int *)prop); else vib->max_us = MAX_TIMEOUT; of_node_put(node); return 0; }
static int vib_of_init(struct vibrator *vib, int vib_nr) { struct device_node *node; const void *prop = NULL; const char *name; int len = 0 ; char dt_path_vib[sizeof(DT_PATH_VIB) + 3]; snprintf(dt_path_vib, sizeof(DT_PATH_VIB) + 2, "%s%1d", DT_PATH_VIB, vib_nr % MAX_VIBS); node = of_find_node_by_path(dt_path_vib); if (!node) return -ENODEV; if (of_property_read_u32(node, DT_PROP_VIB_TYPE, &vib->type)) { zfprintk("DT vibrator type read error\n"); return -ENODEV; } if ((vib->type != VIB_TYPE_GENENIC_ROTARY) && (vib->type != VIB_TYPE_GENENIC_LINEAR)) return -ENODEV; if (of_property_read_u32_array(node, VIB_EN, (u32 *)(&vib->ctrl.vib_en.of), 4)) { zfprintk("DT vibrator VIB_EN settings read error\n"); return -ENODEV; } vib->ctrl.vib_en.name = VIB_EN; vib->ctrl.vib_en.signal_type = SIGNAL_ENABLE; if (vib_signal_init(&vib->ctrl.vib_en)) { zfprintk("vib_en init failed\n"); return -ENODEV; } prop = of_get_property(node, "pwm", &len); if (prop && len) { int j = len / sizeof(struct vib_pwm); if (j > MAX_PWMS) j = MAX_PWMS; if (of_property_read_u32_array(node, "pwm", (u32 *)(&vib->ctrl.vib_pwm), j*4)) { zfprintk("DT vibrator PWM settings read error\n"); return -ENODEV; } } else { zfprintk("pwm not found in %s\n", dt_path_vib); return -ENODEV; } if (of_property_read_u32_array(node, VIB_DIR, (u32 *)(&vib->ctrl.vib_dir.of), 4)) { zfprintk("DT vibrator VIB_DIR settings read error\n"); if (vib->type == VIB_TYPE_GENENIC_LINEAR) { zfprintk("vib_dir not found in %s\n", dt_path_vib); return -ENODEV; } } else { vib->ctrl.vib_dir.name = VIB_DIR; vib->ctrl.vib_dir.signal_type = SIGNAL_DIRECTION; if (vib_signal_init(&vib->ctrl.vib_dir)) { zfprintk("vib_dir init failed\n"); return -ENODEV; } } if (!of_property_read_string(node, "regulator", &name)) { strlcpy(vib->reg.name, name, sizeof(vib->reg.name)); of_property_read_u32(node, "deferred_off", &vib->reg.deferred_off); vib->reg.volt[0].time = MAX_TIMEOUT; vib->reg.volt[0].min_uV = 2800000; vib->reg.volt[0].max_uV = 2800000; prop = of_get_property(node, "voltage", &len); if (prop && len) { int j = len / sizeof(struct vib_voltage); if (j > MAX_VOLT) j = MAX_VOLT; of_property_read_u32_array(node, "voltage", (u32 *)(&vib->reg.volt), j*3); } } if (of_property_read_u32(node, "min", &vib->min_us)) vib->min_us = MIN_TIMEOUT; if (of_property_read_u32(node, "max", &vib->max_us)) vib->max_us = MAX_TIMEOUT; of_node_put(node); return 0; }