int hisi_sensor_apply_expo_gain(struct hisi_sensor_ctrl_t *s_ctrl, void *data)
{
	struct sensor_cfg_data *cdata = (struct sensor_cfg_data *)data;
	struct expo_gain_seq me_seq = cdata->cfg.me_seq;
	struct hisi_sensor_t *sensor = s_ctrl->sensor;
	int i;

	cam_notice("seq_size[%d]", me_seq.seq_size);
	for(i = 0; i < me_seq.seq_size; i++) {
		cam_notice("expo[0x%04x], gain[0x%02x]", me_seq.expo[i], me_seq.gain[i]);
	}
	cam_notice("eof trigger[%d]\n", me_seq.eof_trigger);

	if(sensor->sensor_info->sensor_type == 1) {/*ov sensor*/
		memmove(me_seq.gain + 1, me_seq.gain, sizeof(u32) * me_seq.seq_size);
		me_seq.expo[me_seq.seq_size] = me_seq.expo[me_seq.seq_size - 1];
		me_seq.seq_size++;
	}

	for(i = 0; i < me_seq.seq_size; i++) {
		cam_notice("expo[0x%04x], gain[0x%02x], hts[0x%02x], vts[0x%02x]",
			me_seq.expo[i], me_seq.gain[i], me_seq.hts, me_seq.vts);
	}

	return hw_setup_eof_tasklet(sensor, &me_seq);

}
static int
ov8865_rear_match_id(
        hwsensor_intf_t* si, void * data)
{
    sensor_t* sensor = I2S(si);
    hwsensor_board_info_t *board_info = sensor->board_info;
    struct sensor_cfg_data *cdata = (struct sensor_cfg_data *)data;
    int sensor_index = CAMERA_SENSOR_INVALID;
    int ret = 0;
    int camif_id = -1;

    cam_info("%s TODO.", __func__);

    if(0 == board_info->gpios[FSIN].gpio) {
    	cam_err("%s gpio type[FSIN] is not actived.", __func__);
    	ret = -1;
    	goto out;
    }

    ret = gpio_request(board_info->gpios[FSIN].gpio, "camif_id");
    if(ret < 0) {
    	cam_err("failed to request gpio[%d]", board_info->gpios[FSIN].gpio);
    	goto out;
    }
    ret = gpio_direction_input(board_info->gpios[FSIN].gpio);
    if(ret < 0) {
    	cam_err("failed to control gpio[%d]", board_info->gpios[FSIN].gpio);
    	goto out_gpio;
    }

    ret = gpio_get_value(board_info->gpios[FSIN].gpio);
    if(ret < 0) {
    	cam_err("failed to get gpio[%d]", board_info->gpios[FSIN].gpio);
    	goto out_gpio;
    } else {
    	camif_id = ret;
    	cam_notice("%s camif id = %d.", __func__, camif_id);
    }

    if (camif_id != board_info->camif_id) {
    	cam_notice("%s camera[%s] module is not match.", __func__, board_info->name);
	board_info->sensor_index = CAMERA_SENSOR_INVALID;
    	ret = -1;
    } else {
    	cam_notice("%s camera[%s] match successfully.", __func__, board_info->name);
	sensor_index = board_info->sensor_index;
    	ret = 0;
    }

out_gpio:
	gpio_free(board_info->gpios[FSIN].gpio);
out:
    memset(cdata->cfg.name, 0, sizeof(cdata->cfg.name));
    cdata->data = sensor_index;
    if (ret == 0)
        hwsensor_writefile(sensor->board_info->sensor_index,
            sensor->board_info->name);
    return ret;
}
int hisi_sensor_suspend_eg_task(struct hisi_sensor_ctrl_t *s_ctrl, void *data)
{
	struct sensor_cfg_data *cdata = (struct sensor_cfg_data *)data;
	struct expo_gain_seq ori_state = cdata->cfg.host_ae_seq;

	cam_notice("enter %s", __func__);
	cam_notice("expo[0x%04x], gain[0x%02x], hts[0x%02x], vts[0x%02x]",
		ori_state.expo[0], ori_state.gain[0], ori_state.hts, ori_state.vts);

	return teardown_eof_tasklet(s_ctrl->sensor, &ori_state);
}
static int __init
imx214_sunny_init_module(void)
{
    cam_notice("enter %s",__func__);
    return platform_driver_probe(&s_imx214_sunny_driver,
            imx214_sunny_platform_probe);
}
int hw_mclk_config(sensor_t *s_ctrl,
	struct sensor_power_setting *power_setting, int state)
{
	int sensor_index;

	cam_debug("%s enter.state:%d", __func__, state);
	if (!is_ovisp23_poweron()) {
		cam_notice("%s the ovisp has powered down.", __func__);
		return 0;
	}

	if (SENSOR_INDEX_INVALID != power_setting->sensor_index) {
		sensor_index = power_setting->sensor_index;
	} else {
		sensor_index = s_ctrl->board_info->sensor_index;
	}

	if (hw_is_fpga_board())
		return 0;

	hwcam_mclk_enable(sensor_index, state);
	
	if (0 != power_setting->delay) {
		hw_camdrv_msleep(power_setting->delay);
	}

	return 0;
}
예제 #6
0
static int32_t 
altek6045_platform_probe(
        struct platform_device* pdev)
{
	cam_notice("%s enter", __func__);
    return hwextisp_register(pdev, &s_altek6045.intf);
}
static int __init
ov8865_rear_init_module(void)
{
    cam_notice("enter %s",__func__);
    return platform_driver_probe(&s_ov8865_rear_driver,
            ov8865_rear_platform_probe);
}
예제 #8
0
int altek6045_power_off(const hwextisp_intf_t* i)
{
	return misp_exit();
#if 0
    altek6045_private_data_t* pdata = NULL;
    altek6045_t* mini_isp = NULL;

    cam_notice("enter %s.", __func__);
    mini_isp = I2A(i);
    pdata = (altek6045_private_data_t *)mini_isp->pdata;

    if (ncp6925_ctrl.func_tbl->pmic_seq_config) {
	ret = ncp6925_ctrl.func_tbl->pmic_seq_config(&ncp6925_ctrl, VOUT_LDO_4, VOLTAGE_1P8V, MINI_ISP_POWER_OFF);
    }

    udelay(5);

    if (ncp6925_ctrl.func_tbl->pmic_seq_config) {
	ret = ncp6925_ctrl.func_tbl->pmic_seq_config(&ncp6925_ctrl, VOUT_LDO_5, VOLTAGE_1P1V, MINI_ISP_POWER_OFF);
    }

    udelay(5);

    gpio_direction_output(pdata->pin[ISP_DVDD], MINI_ISP_POWER_OFF);

    msleep(2);
#endif
}
/*
0x300A        chipid         0x00       chipid[23:16]
0x300B        chipid         0x88       chipid[15:8]
0x300C        chipid         0x65       chipid[7:0]

*/
static int
ov8858_match_id(
        hwsensor_intf_t* si, void * data)
{
    sensor_t* sensor = I2S(si);
    struct sensor_cfg_data *cdata = (struct sensor_cfg_data *)data;
	struct sensor_cfg_data cdata_h;
	struct sensor_cfg_data cdata_l;
	u16 sensor_id = 0;

	cdata_h.cfg.reg.subaddr = 0x300B;
	cdata_h.cfg.reg.value = 0;

	cdata_l.cfg.reg.subaddr = 0x300C;
	cdata_l.cfg.reg.value = 0;

	ov8858_i2c_read(si, &cdata_h);
	ov8858_i2c_read(si, &cdata_l);

	sensor_id = (cdata_h.cfg.reg.value) << 8 | (cdata_l.cfg.reg.value);

	cam_notice( "%s, line %d, sensor id: 0x%x", __func__, __LINE__, sensor_id);

    if (0x8858 == sensor_id) {
        cam_info("%s succeed to match id.", __func__);
    } else {
        cam_info("%s failed to match id.", __func__);
        sensor->board_info->sensor_index = CAMERA_SENSOR_INVALID;
    }

    cdata->data = sensor->board_info->sensor_index;
    hwsensor_writefile(sensor->board_info->sensor_index,
        sensor->board_info->name);
    return 0;
}
static int __init
altek6045_init_module(void)
{
    int ret = 0;

    cam_notice("%s enter", __func__);

    ret = platform_driver_probe(&s_altek6045_driver,
                                altek6045_platform_probe);

    /* NOTE: use driver attribute */
    if (ret == 0) {
        if (driver_create_file(&s_altek6045_driver.driver, &driver_attr_test_pipe))
            cam_warn("%s create driver attr failed", __func__);
        if (driver_create_file(&s_altek6045_driver.driver, &driver_attr_ois_pixel))
            cam_warn("%s create driver attr failed", __func__);
        if (driver_create_file(&s_altek6045_driver.driver, &driver_attr_test_ois))
            cam_warn("%s create driver attr failed", __func__);
        if (driver_create_file(&s_altek6045_driver.driver, &driver_attr_check_ois))
            cam_warn("%s create driver attr failed", __func__);
        if (driver_create_file(&s_altek6045_driver.driver, &driver_attr_firmware))
            cam_warn("%s create driver attr firmware failed", __func__);
    }
    //init queue
    init_waitqueue_head(&ois_queue);

    return ret;
}
static int32_t
imx230_plk_platform_probe(
        struct platform_device* pdev)
{
	int rc = 0;
	cam_notice("enter %s",__func__);
	if (pdev->dev.of_node) {
		rc = hw_sensor_get_dt_data(pdev, &s_imx230_plk);
		if (rc < 0) {
			cam_err("%s failed line %d\n", __func__, __LINE__);
			goto imx230_plk_sensor_probe_fail;
		}

		if (s_imx230_plk.board_info->gpios[SUSPEND].gpio == 0) {
			s_imx230_plk.power_setting_array.power_setting = hw_imx230_plk_power_setting_va;
			s_imx230_plk.power_setting_array.size = ARRAY_SIZE(hw_imx230_plk_power_setting_va);
		}

	} else {
		cam_err("%s imx230_plk of_node is NULL.\n", __func__);
		goto imx230_plk_sensor_probe_fail;
	}

	rc = hwsensor_register(pdev, &s_imx230_plk.intf);

imx230_plk_sensor_probe_fail:
	return rc;
}
int
    ov8865_carrera_power_down(
    hwsensor_intf_t* si)
{
    int ret = 0;
    sensor_t* sensor = NULL;
    sensor = I2S(si);
    if(is_poweron) {
        ret = hw_sensor_power_down(sensor);
        cam_notice("---ov8865_carrera power off!---");
        is_poweron = false;
    } else {
        cam_notice("---not power off---");
    }
    return ret;
}
int
    ov8865_carrera_power_up(
        hwsensor_intf_t* si)
{
    int ret = 0;
    sensor_t* sensor = NULL;
    sensor = I2S(si);
    if(!is_poweron) {
        ret = hw_sensor_power_up(sensor);
        cam_notice("+++ov8865_carrera power on!+++");
        is_poweron = true;
    } else {
        cam_notice("+++not power on+++");
    }
    return ret;
}
static int __init
    imx278_carrera_init_module(void)
{
    cam_notice("enter %s",__func__);
    return platform_driver_probe(&s_imx278_carrera_driver,
    imx278_carrera_platform_probe);
}
int imx135_match_id(struct hisi_sensor_ctrl_t *s_ctrl)
{
	int ret = 0;
	u16 id_h = 0;
	u16 id_l = 0;
	u16 sensor_id = 0;

	cam_info( "%s, sensor_chipid:0x%x\n",
		__func__, s_ctrl->sensor->sensor_info->sensor_chipid);

	ret = hisi_sensor_power_up(s_ctrl);
	if(ret) {
		cam_err("sensor[%s] power up failed.", s_ctrl->sensor->sensor_info->name);
		ret = -1;
		goto out;
	}

	/* check sensor id */
	isp_read_sensor_byte(&s_ctrl->sensor->sensor_info->i2c_config, 0x0016, &id_h);

	isp_read_sensor_byte(&s_ctrl->sensor->sensor_info->i2c_config, 0x0017, &id_l);

	sensor_id = id_h << 8 | id_l;

	cam_notice( "sensor id:  0x%x", sensor_id);
	if (sensor_id != s_ctrl->sensor->sensor_info->sensor_chipid) {
		ret =  -1;
	}

out:
	hisi_sensor_power_down(s_ctrl);

	return ret;
}
예제 #16
0
static int hw_vcm_subdev_open(
		struct v4l2_subdev *sd,
		struct v4l2_subdev_fh *fh)
{
	cam_notice("hw_vcm_sbudev open! \n");
	return 0;
}
예제 #17
0
static int
hw_vcm_subdev_close(
		struct v4l2_subdev *sd,
		struct v4l2_subdev_fh *fh)
{
	cam_notice("hw_vcm_sbudev close! \n");
	return 0;
}
예제 #18
0
static int __init
ar1335_init_module(void)
{
    cam_notice("enter %s",__func__);
     return platform_driver_probe(&s_ar1335_driver,
            ar1335_platform_probe);

}
예제 #19
0
int altek6045_exec_cmd(const hwextisp_intf_t* i, hwcam_config_data_t *data)
{
	int rc = 0;
	u8 *in_buf = NULL, *out_buf = NULL;
	u32 opcode, dir_type, block_response, out_len, in_len;
	bool out_to_block;

	cam_notice("enter %s cmd=0x%x.", __func__, data->cmd);

	dir_type = data->cmd & EXTISP_CMD_DIR_FLAG_MASK;
	block_response = data->cmd & EXTISP_CMD_RESP_FLAG_MASK;
	out_len = in_len = (data->cmd & EXTISP_CMD_LEN_MASK)>>EXTISP_CMD_LEN_SHIT;
	opcode = (data->cmd & EXTISP_CMD_OPCODE_MASK)>>EXTISP_CMD_OPCODE_SHIT;

	out_buf = in_buf = data->u.buf;
	out_to_block = (EXTISP_BLOCK_RESPONSE_CMD == block_response)? true: false;

	/* allocate kernel buf: override out_buf out_len*/
	if (out_to_block) {
		out_len = data->ext_buf.user_buf_len;
		if (out_len > 4096) {
			cam_err("%s invalid ext_buf_len=%d", __func__, out_len);
			return -EINVAL;
		}
		out_buf = kmalloc(out_len, GFP_KERNEL);
		if (NULL == out_buf) {
			cam_err("%s kmalloc failed", __func__);
			return -ENOMEM;;
		}
	}

	if (EXTISP_INOUT_CMD == dir_type) {
		rc = misp_exec_bidir_cmd((u16)opcode, data->u.buf, in_len,
							out_to_block, out_buf, out_len);
	} else if (EXTISP_SET_CMD == dir_type) {
		rc = misp_exec_unidir_cmd((u16)opcode, true,
							out_to_block, in_buf, in_len);
	} else if (EXTISP_GET_CMD == dir_type) {
		rc = misp_exec_unidir_cmd((u16)opcode, false,
							out_to_block, out_buf, out_len);
	} else {
		cam_err("%s unkown cmd direction", __func__);
		rc = -EINVAL;
	}

	/* reclaimed kernel buf*/
	if (out_to_block) {
		if (copy_to_user(data->ext_buf.user_buf_ptr, out_buf, out_len)) {
			cam_err("%s copy to user failed", __func__);
			rc = -EFAULT;
		}
		kfree(out_buf);
	}

	return rc;
}
int hw_sensor_pmic_config(hwsensor_board_info_t *sensor_info,
	struct sensor_power_setting *power_setting, int state)
{
    int rc = 0;
    cam_notice("%s enter.", __func__);
    cam_notice("%s seq_val=%d, config_val=%d, state=%d",
        __func__, power_setting->seq_val, power_setting->config_val, state);
    //todo ...
    //use wangzhengyong pmic interface
    if (ncp6925_ctrl.func_tbl->pmic_seq_config) {
	rc = ncp6925_ctrl.func_tbl->pmic_seq_config(&ncp6925_ctrl, power_setting->seq_val, power_setting->config_val, state);
    }

    if (0 != power_setting->delay) {
    	hw_camdrv_msleep(power_setting->delay);
    }

    return rc;
}
static int32_t imx135_platform_probe(struct platform_device *pdev)
{
	int32_t rc = 0;
	const struct of_device_id *match;

	match = of_match_device(hisi_imx135_dt_match, &pdev->dev);
	cam_notice("%s compatible=%s.\n", __func__, match->compatible);
	rc = imx135_sensor_probe(pdev);
	return rc;
}
static int32_t sensor_platform_probe(struct platform_device *pdev)
{
	const struct of_device_id *match;

	match = of_match_device(hisi_sensor_dt_match, &pdev->dev);
	if(!match) {
		cam_err("sensor match device failed");
		return -1;
	}
	cam_notice("%s compatible=%s.\n", __func__, match->compatible);
	return hisi_sensor_platform_probe(pdev, (void*)match->data);
}
예제 #23
0
int altek6045_load_firmware(const hwextisp_intf_t* i)
{
    int rc = 0;
    cam_notice("enter %s.", __func__);

    rc = misp_load_fw();
    if (rc < 0) {
        cam_err("%s failed to load firmware for altek6045.", __func__);
        return rc;
    }
    return 0;
}
예제 #24
0
static int __init hw_ad5816_module_init(void)
{
	int rc = 0;
	cam_debug("%s:%d\n", __func__, __LINE__);

	rc = platform_driver_probe(&hw_ad5816_platform_driver,
		ad5816_platform_probe);
	if (rc < 0) {
		cam_notice("%s platform_driver_probe error.\n", __func__);
	}
	return rc;
}
static int __init ov8830_module_init(void)
{
	int rc = 0;
	cam_debug("%s:%d\n", __func__, __LINE__);

	rc = platform_driver_probe(&ov8830_platform_driver,
		ov8830_platform_probe);
	if (rc < 0) {
		cam_notice("%s platform_driver_probe error(%d).\n", __func__, rc);
	}
	return rc;
}
int hisi_sensor_ldo_config(ldo_index_t ldo, struct hisi_sensor_info *sensor_info,
	struct sensor_power_setting *power_setting, int state)
{
	int index;
	int rc = -1;
	const char *ldo_names[LDO_MAX]
		= {"dvdd", "dvdd2", "avdd", "avdd2", "vcm", "vcm2", "iopw"};

	cam_debug("%s enter, ldo: %d", __func__, ldo);

	if (is_fpga_board())
		return 0;

	for(index = 0; index < sensor_info->ldo_num; index++) {
		if(!strcmp(sensor_info->ldo[index].supply, ldo_names[ldo]))
			break;
	}

	if(index == sensor_info->ldo_num) {
		cam_notice("ldo [%s] is not actived", ldo_names[ldo]);
		return 0;
	}

	if (POWER_ON == state) {
		if(LDO_IOPW != ldo) {
			rc = regulator_set_voltage(sensor_info->ldo[index].consumer, power_setting->config_val, power_setting->config_val);
			if(rc < 0) {
				cam_err("failed to set ldo[%s] to %d V", ldo_names[ldo], power_setting->config_val);
				return rc;
			}
		}
		rc = regulator_bulk_enable(1, &sensor_info->ldo[index]);
		if (rc) {
			cam_err("failed to enable regulators %d\n", rc);
			return rc;
		}
		if (0 != power_setting->delay) {
			camdrv_msleep(power_setting->delay);
		}
	} else {
		regulator_bulk_disable(1, &sensor_info->ldo[index]);
		rc = 0;
	}

	return rc;

}
static int tps61310_off(struct hisi_flash_ctrl_t *flash_ctrl)
{
	struct hisi_flash_i2c_client *i2c_client;
	struct hisi_flash_i2c_fn_t *i2c_func;
	struct tps61310_private_data_t *pdata;
	unsigned int state;
	unsigned char val;

	cam_debug("%s ernter.\n", __func__);

	if (NULL == flash_ctrl) {
		cam_err("%s flash_ctrl is NULL.", __func__);
		return -1;
	}

	if (STANDBY_MODE == flash_ctrl->state.mode) {
		cam_notice("%s flash led has been powered off.", __func__);
		return 0;
	}

	mutex_lock(flash_ctrl->hisi_flash_mutex);
	flash_ctrl->state.mode = STANDBY_MODE;
	flash_ctrl->state.data = 0;
	i2c_client = flash_ctrl->flash_i2c_client;
	i2c_func = flash_ctrl->flash_i2c_client->i2c_func_tbl;
	pdata = (struct tps61310_private_data_t *)flash_ctrl->pdata;

	state = gpio_get_value(pdata->pin[RESET]);
	if (state != LOW) {
		/*************************************************
		 * set flash mode ctrl reg
		 * REGISTER1[7:6] & REGISTER2[7:6]:
		 * 00:shutdown mode
		 *************************************************/
		i2c_func->i2c_read(i2c_client, REGISTER1, &val);
		i2c_func->i2c_write(i2c_client, REGISTER1, val & SHUTDOWN_MODE);
		i2c_func->i2c_read(i2c_client, REGISTER2, &val);
		i2c_func->i2c_write(i2c_client, REGISTER2, val & SHUTDOWN_MODE);
	}

	tps61310_set_strobe0(flash_ctrl, LOW);
	tps61310_set_strobe1(flash_ctrl, HIGH);
	tps61310_set_reset(flash_ctrl, LOW);
	mutex_unlock(flash_ctrl->hisi_flash_mutex);

	return 0;
}
static int hw_scharger_off(struct hw_flash_ctrl_t *flash_ctrl)
{
    struct hw_scharger_private_data_t *pdata;

    cam_debug("%s enter.\n", __func__);

    if (NULL == flash_ctrl) {
        cam_err("%s flash_ctrl is NULL.", __func__);
        return -1;
    }

    if (STANDBY_MODE == flash_ctrl->state.mode) {
        cam_notice("%s flash led has been powered off.", __func__);
        return 0;
    }

    pdata = (struct hw_scharger_private_data_t *)flash_ctrl->pdata;

    if ((NULL == pdata->flash_inter_ldo)
            || (NULL == pdata->flash_mode_ldo)
            || (NULL == pdata->torch_mode_ldo)) {
        cam_err("%s regulator is NULL", __func__);
        return -1;
    }

    mutex_lock(flash_ctrl->hw_flash_mutex);

    if (BIT(TORCH_MODE) & pdata->status) {
        regulator_disable(pdata->torch_mode_ldo);
        regulator_disable(pdata->flash_inter_ldo);
        pdata->status &= ~BIT(TORCH_MODE);
    }

    if (BIT(FLASH_MODE) & pdata->status) {
        regulator_disable(pdata->flash_mode_ldo);
        regulator_disable(pdata->flash_inter_ldo);
        pdata->status &= ~BIT(FLASH_MODE);
    }

    flash_ctrl->state.mode = STANDBY_MODE;
    flash_ctrl->state.data = 0;

    mutex_unlock(flash_ctrl->hw_flash_mutex);

    return 0;
}
static int32_t hisi_sensor_platform_probe(struct platform_device *pdev,
	void *data)
{
	int32_t rc = 0;
	uint32_t group_id;
	struct hisi_sensor_ctrl_t *s_ctrl =
		(struct hisi_sensor_ctrl_t *)data;
	const char *sd_name = NULL;

	s_ctrl->pdev = pdev;
	s_ctrl->dev = &pdev->dev;
	group_id = s_ctrl->index ? HISI_CAMERA_SUBDEV_SENSOR1
				: HISI_CAMERA_SUBDEV_SENSOR0;

	if (!s_ctrl->sensor_v4l2_subdev_ops)
		s_ctrl->sensor_v4l2_subdev_ops = &hisi_sensor_subdev_ops;

	s_ctrl->hisi_sd.sd.internal_ops = &hisi_sensor_subdev_internal_ops;

	v4l2_subdev_init(&s_ctrl->hisi_sd.sd,
			s_ctrl->sensor_v4l2_subdev_ops);

	rc = of_property_read_string(pdev->dev.of_node, "hisi,sensor-name",
		&sd_name);
	cam_notice("%s name %s, rc %d\n", __func__, sd_name, rc);
	if (rc < 0) {
		cam_err("%s failed %d\n", __func__, __LINE__);
	}

	snprintf(s_ctrl->hisi_sd.sd.name,
		sizeof(s_ctrl->hisi_sd.sd.name), "%s",
		sd_name);

	cam_debug("%s sd.name is %s.\n", __func__, s_ctrl->hisi_sd.sd.name);

	v4l2_set_subdevdata(&s_ctrl->hisi_sd.sd, pdev);
	s_ctrl->hisi_sd.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
	media_entity_init(&s_ctrl->hisi_sd.sd.entity, 0, NULL, 0);
	s_ctrl->hisi_sd.sd.entity.type = MEDIA_ENT_T_V4L2_SUBDEV;
	s_ctrl->hisi_sd.sd.entity.group_id = group_id;
	s_ctrl->hisi_sd.sd.entity.name = s_ctrl->hisi_sd.sd.name;
	hisi_sd_register(&s_ctrl->hisi_sd);

	return rc;
}
예제 #30
0
static int __init 
altek6045_init_module(void)
{
	int ret = 0;

	cam_notice("%s enter", __func__);

	ret = platform_driver_probe(&s_altek6045_driver,
			altek6045_platform_probe);

	/* NOTE: use driver attribute */
	if (ret == 0) {
		if (driver_create_file(&s_altek6045_driver.driver, &driver_attr_test_pipe))
			cam_warn("%s create driver attr failed", __func__);
	}

	return ret;
}