static int watch_fontdata_attr_init(struct lg4945_data *d)
{
	d->watch.font_written_size = 0;
	d->watch.font_width = 0;
	d->watch.font_written_comp_size = COMP_FONTM_MAX_SIZE;
	d->watch.fontdata_size = MAX_WATCH_DATA_SIZE;
	d->watch.fontdata_comp_size = COMP_FONTM_MAX_SIZE;
	d->watch.ext_wdata.font_data =
			kzalloc(d->watch.fontdata_size, GFP_KERNEL);
	d->watch.ext_wdata.comp_buf =
			kzalloc(d->watch.fontdata_comp_size, GFP_KERNEL);
	if (d->watch.ext_wdata.font_data && d->watch.ext_wdata.comp_buf) {
		TOUCH_I("%s font_buffer(%d KB) malloc\n", __func__,
			d->watch.fontdata_size/1024);
	} else {
		TOUCH_E("%s font_buffer(%d KB) malloc failed\n", __func__,
			d->watch.fontdata_size/1024);
		return 1;
	}

	sysfs_bin_attr_init(&d->watch.fontdata_attr);
	d->watch.fontdata_attr.attr.name = "config_fontdata";
	d->watch.fontdata_attr.attr.mode = S_IWUSR | S_IRUSR;
	d->watch.fontdata_attr.read = watch_access_read;
	d->watch.fontdata_attr.write = watch_access_write;
	d->watch.fontdata_attr.size = d->watch.fontdata_size;

	if (sysfs_create_bin_file(&d->kobj, &d->watch.fontdata_attr) < 0)
		TOUCH_E("Failed to create %s\n",
			d->watch.fontdata_attr.attr.name);
	return 0;
}
static ssize_t store_extwatch_fontonoff
	(struct device *dev, const char *buf, size_t count)
{
	struct lg4945_data *d = to_lg4945_data(dev);
	u8 value;
	u8 zero = '0';
	int ret = 0;

	if (atomic_read(&d->block_watch_cfg) == SUPPORT)
		return count;

	memcpy((char *)&value, buf, sizeof(u8));

	if (value == POWER_OFF || value == zero)
		value = 0x00;
	else
		value = 0x01;

	TOUCH_I("%s : %s\n", __func__,
			value ? "On" : "Off");

	ret = ext_watch_set_cfg(dev);
	if (ret)
		TOUCH_E("Fail %d\n", ret);

	d->watch.ext_wdata.time.disp_waton = value;
	ret = ext_watch_onoff(dev);
	if (ret)
		TOUCH_E("Fail %d\n", ret);

	return count;
}
int ext_watch_check_font_download(struct device *dev)
{
	struct touch_core_data *ts = to_touch_core(dev);
	struct lg4945_data *d = to_lg4945_data(dev);
	int ret = 0;

	TOUCH_I("%s:start\n", __func__);
	if (atomic_read(&d->watch.state.is_font) != DOWN_LOADED) {
		TOUCH_I("%s : font data is not\n", __func__);
		return -ENOMEM;
	}

	if (touch_mfts_mode_check(dev))
		return -EBUSY;

	if (atomic_read(&d->watch.state.font_mem) == DOWN_LOADING) {
		TOUCH_I("%s : doing download..\n", __func__);
		return -EBUSY;
	}
	if (atomic_read(&d->watch.state.font_mem) == DOWN_LOADED) {
		TOUCH_I("%s : not need download..\n", __func__);
		return -EBUSY;
	}

	if (d->watch.ext_wdata.font_data == NULL) {
		TOUCH_E("%s : font data is not ready\n",
			__func__);
		return -ENOMEM;
	}

	queue_delayed_work(ts->wq, &d->font_download_work, 0);

	return ret;
}
static ssize_t show_extwatch_current_time
	(struct device *dev, char *buf)
{
	struct lg4945_data *d = to_lg4945_data(dev);
	int ret = 0;

	TOUCH_TRACE();
	if (d == NULL)
		return ret;

	ret = lg4945_reg_read(dev, EXT_WATCH_RTC_CTST,
		(u8 *)&d->watch.ext_wdata.time.rtc_ctst, sizeof(u32));

	if (ret) {
		TOUCH_E("lg4945_read error : %d\n", ret);
		return ret;
	}
	ret = snprintf(buf, PAGE_SIZE, "%02d:%02d:%02d:%03d\n",
		d->watch.ext_wdata.time.rtc_ctst.hour,
		d->watch.ext_wdata.time.rtc_ctst.min,
		d->watch.ext_wdata.time.rtc_ctst.sec,
		d->watch.ext_wdata.time.rtc_sctcnt);

	return ret;
}
static ssize_t store_extwatch_fontposition_config(struct device *dev,
		const char *buf, size_t count)
{
	struct lg4945_data *d = to_lg4945_data(dev);
	struct ExtWatchFontPostionConfig cfg;

	if (atomic_read(&d->block_watch_cfg) == SUPPORT)
		return count;

	memcpy((char *)&cfg, buf, sizeof(struct ExtWatchFontPostionConfig));

	d->watch.ext_wdata.mode.watch_area.watstartx = cfg.watstartx;
	d->watch.ext_wdata.mode.watch_area.watendx = cfg.watendx;
	d->watch.ext_wdata.position.h10x_pos = cfg.h10x_pos;
	d->watch.ext_wdata.position.h1x_pos = cfg.h1x_pos;
	d->watch.ext_wdata.position.m10x_pos = cfg.m10x_pos;
	d->watch.ext_wdata.position.m1x_pos = cfg.m1x_pos;
	d->watch.ext_wdata.position.clx_pos = cfg.clx_pos;

	if ( cfg.watstartx < 0x190 || cfg.watendx > 0x5A0 )
		TOUCH_E("check the position. (invalid range)\n");

	TOUCH_I("%s : Watch area [%d , %d] position [%d %d %d %d %d]\n",
		__func__, cfg.watstartx, cfg.watendx, cfg.h10x_pos,
		cfg.h1x_pos, cfg.clx_pos, cfg.m10x_pos, cfg.m1x_pos);

	return count;
}
static ssize_t store_extwatch_timesync_config(struct device *dev,
		const char *buf, size_t count)
{
	struct lg4945_data *d = to_lg4945_data(dev);
	struct ExtWatchTimeSyncConfig cfg;
	int ret = 0;

	if (atomic_read(&d->block_watch_cfg) == SUPPORT)
		return count;

	memcpy((char *)&cfg, buf, sizeof(struct ExtWatchTimeSyncConfig));

	d->watch.ext_wdata.time.rtc_sct.hour = cfg.rtc_cwhour;
	d->watch.ext_wdata.time.rtc_sct.min = cfg.rtc_cwmin;
	d->watch.ext_wdata.time.rtc_sct.sec = cfg.rtc_cwsec;
	d->watch.ext_wdata.time.rtc_sctcnt = cfg.rtc_cwmilli;

	TOUCH_I("%s : %02d:%02d:%02d.%03d\n", __func__,
		cfg.rtc_cwhour, cfg.rtc_cwmin, cfg.rtc_cwsec, cfg.rtc_cwmilli);

	ret = ext_watch_set_current_time(dev);
	if (ret)
		TOUCH_E("%s fail\n", __func__);

	return count;
}
static int ext_watch_font_dump(struct device *dev, char *font_dump)
{
	u32 font_sel = 0;
	u32 font_data_offset = 0;
	u32 wdata = 0;
	u32 size = 0;
	int ret = 0;

	TOUCH_TRACE();

	/* Font memory access enable */
	wdata = 1;
	ret = lg4945_reg_write(dev, EXT_WATCH_FONT_ACC_EN,
		(u8 *)&wdata, sizeof(u32));
	if (ret)
		goto error;

	size = sizeof(u32) * EXT_WATCH_FONT_NUM_SIZE;

	for (font_sel = 0; font_sel < 10; font_sel++) {
		/* Font select : '0' ~ '9' */
		font_data_offset = font_sel * size;
		ret = lg4945_reg_write(dev, EXT_WATCH_FONT_SEL,
					(u8 *)&font_sel, sizeof(u32));
		if (ret)
			goto error;

		ret = lg4945_reg_read(dev, EXT_WATCH_FONT_OFFSET_ADDR,
			(u8 *)&font_dump[font_data_offset], size);
		if (ret)
			goto error;
	}

	/* Font select : ':' */
	font_data_offset = font_sel * size;
	size = sizeof(u32) * EXT_WATCH_FONT_CHAR_SIZE;
	ret = lg4945_reg_write(dev, EXT_WATCH_FONT_SEL,
		(u8 *)&font_sel, sizeof(u32));
	if (ret)
		goto error;
	ret = lg4945_reg_read(dev, EXT_WATCH_FONT_OFFSET_ADDR,
			(u8 *)&font_dump[font_data_offset], size);
	if (ret)
		goto error;

	/* Font memory access disable */
	wdata = 0;
	ret = lg4945_reg_write(dev, EXT_WATCH_FONT_ACC_EN,
		(u8 *)&wdata, sizeof(u32));
	if (ret)
		goto error;

	TOUCH_I("%s done\n", __func__);
	return ret;

error:
	TOUCH_E("fail %d\n", ret);
	return -EIO;
}
static int ext_watch_get_position(struct device *dev)
{
	struct lg4945_data *d = to_lg4945_data(dev);
	u8 *ptr = (u8 *)(&d->watch.ext_wdata.position);
	struct ext_watch_status_cfg status_cfg;
	int ret = 0;

	TOUCH_I("start\n");

	ret = lg4945_reg_read(dev, EXT_WATCH_POSITION_R, ptr,
				sizeof(u32) * 3);

	if (ret)
		goto error;
	TOUCH_I("Get Hour Position [%d][%d]\n",
		d->watch.ext_wdata.position.h10x_pos,
		d->watch.ext_wdata.position.h1x_pos);
	TOUCH_I("Get Min Position [%d][%d]\n",
		d->watch.ext_wdata.position.m10x_pos,
		d->watch.ext_wdata.position.m1x_pos);
	TOUCH_I("Get Colon Position [%d]\n",
			d->watch.ext_wdata.position.clx_pos);

	ret = lg4945_reg_read(dev, EXT_WATCH_SATATE, (u8 *)&status_cfg,
				sizeof(u32));
	if (ret)
		goto error;
	d->watch.ext_wdata.position.zero_disp = status_cfg.zero_en;
	d->watch.ext_wdata.position.h24_en = status_cfg.en_24;
	d->watch.ext_wdata.position.clock_disp_mode = status_cfg.disp_mode;
	d->watch.ext_wdata.position.midnight_hour_zero_en
		= status_cfg.midnight_hour_zero_en;
	d->watch.ext_wdata.position.bhprd = status_cfg.bhprd;

	TOUCH_I("Get Zero Display [%d]\n",
		d->watch.ext_wdata.position.zero_disp);
	TOUCH_I("Get 24H Mode [%d]\n",
		d->watch.ext_wdata.position.h24_en);
	TOUCH_I("Get Clock Mode [%d]\n",
		d->watch.ext_wdata.position.clock_disp_mode);
	TOUCH_I("Get Midnight Mode [%d]\n",
		d->watch.ext_wdata.position.midnight_hour_zero_en);
	TOUCH_I("Get Blink period [%d]\n", d->watch.ext_wdata.position.bhprd);
	TOUCH_I("Get Current Watch[%d]\n", status_cfg.step);
	TOUCH_I("Get Watch Enable[%d]\n", status_cfg.en);

	if (d->watch.ext_wdata.position.clock_disp_mode)
		TOUCH_I("Get Current Time[%02d][%02d]\n",
			status_cfg.cur_min, status_cfg.cur_sec);
	else
		TOUCH_I("Get Current Time[%02d][%02d]\n",
		status_cfg.cur_hour, status_cfg.cur_min);

	return ret;
error:
	TOUCH_E("Fail %d\n", ret);
	return -EIO;
}
int watch_init(struct device *dev)
{
	int ret = 0;

	TOUCH_I("%s\n", __func__);

	if (touch_mfts_mode_check(dev))
		return -EBUSY;

	ret = ext_watch_set_cfg(dev);
	if (ret)
		TOUCH_E("Fail %d\n", ret);

	ret = ext_watch_onoff(dev);
	if (ret)
		TOUCH_E("Fail %d\n", ret);

	return ret;
}
void ext_watch_font_download_func(
	struct work_struct *font_download_work)
{
	struct lg4945_data *d =
		container_of(to_delayed_work(font_download_work),
				struct lg4945_data, font_download_work);
	struct touch_core_data *ts = to_touch_core(d->dev);

	u32 wdata = 0;
	int ret = 0;

	if (d->lcd_mode != LCD_MODE_U3) {
		TOUCH_E("skip font download, lcd mode[U%d]\n", d->lcd_mode);
		ret = -EBUSY;
		goto error;
	}

	TOUCH_I("%s start\n", __func__);
	/* Font memory access enable */
	wdata = 1;
	ret = lg4945_reg_write(ts->dev, EXT_WATCH_FONT_ACC_EN,
		(u8 *)&wdata, sizeof(u32));
	if (ret)
		goto error;

	ret = lg4945_reg_write(ts->dev, EXT_WATCH_FONT_COMP_ADDR,
		(u8 *)d->watch.ext_wdata.comp_buf,
		COMP_FONTM_MAX_SIZE);

	if (ret)
		goto error;
	wdata = 0;
	ret = lg4945_reg_write(ts->dev, EXT_WATCH_FONT_ACC_EN,
		(u8 *)&wdata, sizeof(u32));
	if (ret)
		goto error;
	atomic_set(&d->watch.state.font_mem, DOWN_LOADED);
	TOUCH_I("%s done\n", __func__);
	return;
error:
	TOUCH_E("Fail [%d]\n", ret);
}
Ejemplo n.º 11
0
int touch_bus_device_init(struct touch_hwif *hwif, void *driver)
{
	if (hwif->bus_type == HWIF_I2C)
		return touch_i2c_device_init(hwif, driver);
	else if (hwif->bus_type == HWIF_SPI)
		return touch_spi_device_init(hwif, driver);

	TOUCH_E("Unknown touch interface : %d\n", hwif->bus_type);

	return -ENODEV;
}
/* ext_watch_set_onoff
 *
 * 'power state' can has only 'ON' or 'OFF'. (not 'SLEEP' or 'WAKE')
 */
static int ext_watch_onoff(struct device *dev)
{
	struct lg4945_data *d = to_lg4945_data(dev);
	int ret = 0;

	ret = lg4945_reg_write(dev, EXT_WATCH_RTC_CTRL,
			&d->watch.ext_wdata.time.disp_waton, sizeof(u8));
	if (ret)
		goto error;
	return ret;
error:
	TOUCH_E("Fail %d\n", ret);
	return -EIO;
}
static int ext_watch_set_current_time(struct device *dev)
{
	struct lg4945_data *d = to_lg4945_data(dev);
	u32 rtc_ctrl = EXT_WATCH_RTC_STOP;
	u16 rtc_count = 305;		/* for time, 1 /rtc_ecnt */
	int ret = 0;


	d->watch.ext_wdata.time.rtc_ecnt = 32764;
	d->watch.ext_wdata.time.rtc_sctcnt =
		(int)((d->watch.ext_wdata.time.rtc_sctcnt * rtc_count) / 10);

	ret = lg4945_reg_write(dev, EXT_WATCH_RTC_RUN,
		(u8 *)&rtc_ctrl, sizeof(u32));
	if (ret)
		goto error;
	ret = lg4945_reg_write(dev, EXT_WATCH_RTC_SCT,
		(u8 *)&d->watch.ext_wdata.time.rtc_sct, sizeof(u32));
	if (ret)
		goto error;

	ret = lg4945_reg_write(dev, EXT_WATCH_RTC_SCTCNT,
		(u8 *)&d->watch.ext_wdata.time.rtc_sctcnt, sizeof(u32));
	if (ret)
		goto error;

	rtc_ctrl = d->watch.ext_wdata.time.rtc_ecnt & 0xFFFF;
	ret = lg4945_reg_write(dev, EXT_WATCH_RTC_ECNT,
		(u8 *)&rtc_ctrl, sizeof(u32));
	if (ret)
		goto error;

	rtc_ctrl = EXT_WATCH_RTC_START;
	ret = lg4945_reg_write(dev, EXT_WATCH_RTC_RUN,
		(u8 *)&rtc_ctrl, sizeof(u32));
	if (ret)
		goto error;

	TOUCH_I("%s : %02d:%02d:%02d CLK[%d Hz]\n", __func__,
		d->watch.ext_wdata.time.rtc_sct.hour,
		d->watch.ext_wdata.time.rtc_sct.min,
		d->watch.ext_wdata.time.rtc_sct.sec,
		d->watch.ext_wdata.time.rtc_ecnt);

	return ret;

error:
	TOUCH_E("Fail %d\n", ret);
	return -EIO;
}
Ejemplo n.º 14
0
int touch_bus_xfer(struct device *dev, struct touch_xfer_msg *xfer)
{
	struct touch_core_data *ts = to_touch_core(dev);
	int ret = 0;

	if (ts->bus_type == HWIF_I2C) {
		TOUCH_E("Not implemented\n");
		ret = -1;
	} else if (ts->bus_type == HWIF_SPI) {
		ret = touch_spi_xfer(to_spi_device(dev), xfer);
	}

	return ret;
}
static int ext_watch_set_mcs_ctrl(struct spi_device *spi, u8 enable)
{
	u8 mcs_value = 0;

	if (enable)
		mcs_value = 0xAC;
	else
		mcs_value = 0xCA;

	DO_SAFE(sic_spi_write(spi, EXT_WATCH_MCS_ACCESS, (u8 *)&mcs_value, sizeof(u8)), error);
	//TOUCH_I("MCS Access onoff : %X  \n", mcs_value);
	return NO_ERROR;
error:
	TOUCH_E("MCS Access Fail\n");
	return ERROR;
}
static int ext_watch_set_mode(struct device *dev)
{
	struct lg4945_data *d = to_lg4945_data(dev);
	u8 *ptr = NULL;
	u16 offset = EXT_WATCH_CTRL;
	u32 size = sizeof(u32);
	u32 pack[3] = {0, };
	int ret = 0;

	if (ret < 0)
		return ret;

	ptr = (u8 *)(&d->watch.ext_wdata.mode.watch_ctrl);
	offset = EXT_WATCH_CTRL;
	pack[0] = ptr[0];
	pack[1] = ptr[1];
	ret = lg4945_reg_write(dev,  offset, &pack[0], size * 2);


	ptr = (u8 *)(&d->watch.ext_wdata.mode.watch_area);
	offset = EXT_WATCH_AREA;
	pack[0] = ptr[0];
	pack[1] = ptr[1];
	pack[2] = ptr[2];
	ret = lg4945_reg_write(dev,  offset, &pack[0], size * 3);

	ptr = (u8 *)(&d->watch.ext_wdata.mode.blink_area);
	offset = EXT_WATCH_BLINK_AREA;
	pack[0] = ptr[0];
	pack[1] = ptr[1];
	pack[2] = ptr[2];
	ret = lg4945_reg_write(dev,  offset, &pack[0], size * 3);

	ptr = (u8 *)(&d->watch.ext_wdata.mode.grad);
	offset = EXT_WATCH_GRAD;
	ret = lg4945_reg_write(dev,  offset, &ptr[0], size * 6);

	offset = EXT_WATCH_LUT;
	ptr = (u8 *)(&d->watch.ext_wdata.mode.lut[0]);
	ret = lg4945_reg_write(dev,  offset, &ptr[0],
		size * 3 * EXT_WATCH_LUT_NUM);

	if (ret < 0)
		TOUCH_E("failed %d\n", ret);

	return ret;
}
Ejemplo n.º 17
0
void touch_power_vio(struct device *dev, int value)
{
	struct touch_core_data *ts = to_touch_core(dev);
	int ret = 0;

	if (gpio_is_valid(ts->vio_pin)) {
		ret = gpio_direction_output(ts->vio_pin, value);
	} else if (!IS_ERR_OR_NULL(ts->vio)) {
		if (value)
			ret = regulator_enable((struct regulator *)ts->vio);
		else
			ret = regulator_disable((struct regulator *)ts->vio);
	}

	if (ret)
		TOUCH_E("ret = %d", ret);
}
/* ext_watch_shutdown
 *
 * 'power state' can has only  'SLEEP' or 'WAKE' (not 'ON' or 'OFF')
 */
static int ext_watch_shutdown(struct device *dev, u8 onoff)
{
	u32 rtc_ctrl = EXT_WATCH_RTC_STOP;
	int ret = 0;

	if (onoff == EXT_WATCH_RTC_START)
		rtc_ctrl = EXT_WATCH_RTC_START;

	ret = lg4945_reg_write(dev, EXT_WATCH_RTC_RUN,
		(u8 *)&rtc_ctrl, sizeof(u32));

	if (ret)
		goto error;
	return ret;
error:
	TOUCH_E("Fail %d\n", ret);
	return -EIO;
}
static int ext_watch_set_position(struct device *dev)
{
	struct lg4945_data *d = to_lg4945_data(dev);
	u8 *ptr = (u8 *)(&d->watch.ext_wdata.position);
	int ret = 0;

	if (d->lcd_mode != LCD_MODE_U3) {
		TOUCH_I("skip %s, lcd mode[U%d]\n", __func__, d->lcd_mode);
	} else {
		ret = lg4945_reg_write(dev, EXT_WATCH_POSITION,
					ptr, sizeof(u32)*5);
		if (ret)
			goto error;
	}
	return ret;
error:
	TOUCH_E("Fail %d\n", ret);
	return -EIO;
}
static int ext_watch_get_current_time(struct device *dev)
{
	struct lg4945_data *d = to_lg4945_data(dev);
	int ret = 0;

	TOUCH_TRACE();
	ret = lg4945_reg_read(dev, EXT_WATCH_RTC_CTST,
		(u8 *)&d->watch.ext_wdata.time.rtc_ctst, sizeof(u32));

	if (ret < 0) {
		TOUCH_E("%s Fail\n", __func__);
		return ret;
	}

	TOUCH_I("%s : %02d:%02d:%02d\n", __func__,
		d->watch.ext_wdata.time.rtc_ctst.hour,
		d->watch.ext_wdata.time.rtc_ctst.min,
		d->watch.ext_wdata.time.rtc_ctst.sec);

	return ret;
}
static int ext_watch_set_cfg(struct device *dev)
{
	struct lg4945_data *d = to_lg4945_data(dev);
	int ret = 0;

	TOUCH_TRACE();

	d->watch.ext_wdata.mode.watch_ctrl.alpha = 1; /* bypass foreground */
	ret = ext_watch_set_mode(dev);
	if (ret)
		goto error;

	ret = ext_watch_set_position(dev);
	if (ret)
		goto error;

	return ret;
error:
	TOUCH_E("Fail %d\n", ret);
	return -ECANCELED;

}
int watch_register_sysfs(struct device *dev)
{
	struct touch_core_data *ts = to_touch_core(dev);
	struct lg4945_data *d = to_lg4945_data(dev);
	int ret;

	TOUCH_TRACE();

	ret = kobject_init_and_add(&d->kobj, &watch_kobj_type,
			ts->input->dev.kobj.parent->parent,
			"%s", LGE_EXT_WATCH_NAME);

	ret = sysfs_create_group(&d->kobj, &watch_attribute_group);

	if (ret < 0) {
		TOUCH_E("failed to create sysfs\n");
		return ret;
	}

	watch_fontdata_attr_init(d);

	return ret;
}
static ssize_t store_extwatch_onoff(struct device *dev,
		const char *buf, size_t count)
{
	u8 value;
	u8 zero = '0';
	int ret = 0;

	memcpy(&value, buf, sizeof(u8));

	if (value == POWER_OFF || value == zero)
		value = 0x00;
	else
		value = 0x01;

	ret = ext_watch_shutdown(dev, value);
	if (ret)
		TOUCH_E("Fail %d\n", ret);

	TOUCH_I("%s : %s\n", __func__,
			value ? "START" : "STOP");

	return count;
}
static int ext_watch_get_dic_st(struct device *dev)
{
	u32 dic_status = 0;
	u32 watch_status = 0;
	int ret = 0;

	TOUCH_TRACE();

	ret = lg4945_reg_read(dev,  SYS_DISPMODE_STATUS, (u8 *)&dic_status,
		sizeof(u32));
	if (ret)
		goto error;
	ret = lg4945_reg_read(dev,  EXT_WATCH_RTC_CTRL, (u8 *)&watch_status,
		sizeof(u32));

	TOUCH_I("DIC_STATUS U%d , Watch %s\n",
		(dic_status>>5)&0x3, watch_status ? "ON" : "OFF");

	return ret;
error:
	TOUCH_E("Fail %d\n", ret);
	return -EIO;
}
Ejemplo n.º 25
0
int touch_spi_xfer(struct spi_device *spi, struct touch_xfer_msg *xfer)
{
	struct touch_xfer_data_t *tx = NULL;
	struct touch_xfer_data_t *rx = NULL;
	struct spi_transfer x[MAX_XFER_COUNT];
	struct spi_message m;
	int i = 0;

	if (xfer->msg_count > MAX_XFER_COUNT) {
		TOUCH_E("cout exceed\n");
		return -1;
	}

	spi_message_init(&m);
	memset(x, 0, sizeof(x));

	for (i = 0; i < xfer->msg_count; i++) {
		tx = &xfer->data[i].tx;
		rx = &xfer->data[i].rx;

		x[i].cs_change = 1;
		x[i].bits_per_word = xfer->bits_per_word;

		if (rx->size) {
			x[i].tx_buf = tx->data;
			x[i].rx_buf = rx->data;
			x[i].len = rx->size;
		} else {
			x[i].tx_buf = tx->data;
			x[i].rx_buf = NULL;
			x[i].len = tx->size;
		}
		spi_message_add_tail(&x[i], &m);
	}

	return spi_sync(spi, &m);
}
Ejemplo n.º 26
0
int touch_bus_init(struct device *dev, int buf_size)
{
	struct touch_core_data *ts = to_touch_core(dev);
	int ret = 0;

	TOUCH_TRACE();

	if (buf_size) {
		ts->tx_buf = devm_kzalloc(dev, buf_size, GFP_KERNEL);
		if (!ts->tx_buf)
			TOUCH_E("fail to allocate tx_buf\n");

		ts->rx_buf = devm_kzalloc(dev, buf_size, GFP_KERNEL);
		if (!ts->rx_buf)
			TOUCH_E("fail to allocate rx_buf\n");
	}

	ts->xfer = devm_kzalloc(dev, sizeof(struct touch_xfer_msg), GFP_KERNEL);
	if (!ts->xfer)
		TOUCH_E("fail to allocate xfer\n");

	ts->pinctrl.ctrl = devm_pinctrl_get(dev);

	if (IS_ERR_OR_NULL(ts->pinctrl.ctrl)) {
		if (PTR_ERR(ts->pinctrl.ctrl) == -EPROBE_DEFER)
			return -EPROBE_DEFER;

		TOUCH_I("Target does not use pinctrl\n");
		ts->pinctrl.ctrl = NULL;
	} else {
		ts->pinctrl.active = pinctrl_lookup_state(ts->pinctrl.ctrl,
				"touch_pin_active");

		if (IS_ERR_OR_NULL(ts->pinctrl.active))
			TOUCH_E("cannot get pinctrl.active\n");

		ts->pinctrl.suspend = pinctrl_lookup_state(ts->pinctrl.ctrl,
				"touch_pin_sleep");

		if (IS_ERR_OR_NULL(ts->pinctrl.suspend))
			TOUCH_E("cannot get pinctrl.suspend\n");

		if (!IS_ERR_OR_NULL(ts->pinctrl.active)) {
			ret = pinctrl_select_state(ts->pinctrl.ctrl,
					ts->pinctrl.active);
			if (ret)
				TOUCH_I("cannot set pinctrl.active\n");
			else
				TOUCH_I("pinctrl set active\n");
		}
	}

	if (ts->bus_type == HWIF_SPI) {
		ret = spi_setup(to_spi_device(dev));

		if (ret < 0) {
			TOUCH_E("Failed to perform SPI setup\n");
			return -ENODEV;
		}
	}

	return ret;
}
static int ext_watch_get_mode(struct device *dev)
{
	struct lg4945_data *d = to_lg4945_data(dev);
	u8 *ptr = NULL;
	u16 offset = EXT_WATCH_CTRL;
	u16 idx = 0;
	u32 size = sizeof(u8);
	int ret = 0;

	TOUCH_I("start\n");

	if (ret)
		goto error;

	ptr = (u8 *)(&d->watch.ext_wdata.mode.watch_ctrl);
	offset = EXT_WATCH_CTRL;
	ret = lg4945_reg_read(dev,  offset++, &ptr[0], size);
	ret = lg4945_reg_read(dev,  offset++, &ptr[1], size);
	TOUCH_I("Get Offet[%X] watch_ctrl %02X %02X\n",
		EXT_WATCH_CTRL, ptr[0], ptr[1]);

	ptr = (u8 *)(&d->watch.ext_wdata.mode.watch_area);
	offset = EXT_WATCH_AREA;
	ret = lg4945_reg_read(dev,  offset++, &ptr[0], size);
	ret = lg4945_reg_read(dev,  offset++, &ptr[1], size);
	ret = lg4945_reg_read(dev,  offset++, &ptr[2], size);
	TOUCH_I("Get Offet[%X] watch_area %02X %02X %02X\n",
		EXT_WATCH_AREA, ptr[0], ptr[1], ptr[2]);

	ptr = (u8 *)(&d->watch.ext_wdata.mode.blink_area);
	offset = EXT_WATCH_BLINK_AREA;
	ret = lg4945_reg_read(dev,  offset++, &ptr[0], size);
	ret = lg4945_reg_read(dev,  offset++, &ptr[1], size);
	ret = lg4945_reg_read(dev,  offset++, &ptr[2], size);
	TOUCH_I("Get Offet[%X] blink_area %02X %02X %02X\n",
		EXT_WATCH_BLINK_AREA, ptr[0], ptr[1], ptr[2]);

	ptr = (u8 *)(&d->watch.ext_wdata.mode.grad);
	offset = EXT_WATCH_GRAD;
	ret = lg4945_reg_read(dev,  offset++, &ptr[0], size);
	ret = lg4945_reg_read(dev,  offset++, &ptr[1], size);
	ret = lg4945_reg_read(dev,  offset++, &ptr[2], size);
	ret = lg4945_reg_read(dev,  offset++, &ptr[3], size);
	ret = lg4945_reg_read(dev,  offset++, &ptr[4], size);
	ret = lg4945_reg_read(dev,  offset++, &ptr[5], size);
	TOUCH_I("Get Offet[%X] grad %02X %02X %02X %02X %02X %02X\n",
		EXT_WATCH_GRAD, ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]);

	offset = EXT_WATCH_LUT;
	for (idx = 0; idx < EXT_WATCH_LUT_NUM; idx++) {
		ptr = (u8 *)(&d->watch.ext_wdata.mode.lut[idx]);
		ret = lg4945_reg_read(dev,  offset++, &ptr[0], size);
		ret = lg4945_reg_read(dev,  offset++, &ptr[1], size);
		ret = lg4945_reg_read(dev,  offset++, &ptr[2], size);
		TOUCH_I("Get Offet[%X] LUT[%d] : B[%02X] G[%02X] R[%02X]\n",
			offset - 3, idx, ptr[0], ptr[1], ptr[2]);
	}

	if (ret)
		goto error;
	TOUCH_I("end\n");
	return ret;

error:
	TOUCH_E("failed %d\n", ret);
	return -EIO;
}
int _write_log(char *filename, char *data)
{
	struct file *file;
	loff_t pos = 0;
	int flags;
	char *fname = "/mnt/sdcard/touch_self_test.txt";
	char *fname_mfts_folder = "/mnt/sdcard/touch_self_test_mfts_folder.txt";
	char *fname_mfts_flat = "/mnt/sdcard/touch_self_test_mfts_flat.txt";
	char *fname_mfts_curved = "/mnt/sdcard/touch_self_test_mfts_curved.txt";
	int cap_file_exist = 0;

	if (f54_window_crack || f54_window_crack_check_mode == 0) {
		mm_segment_t old_fs = get_fs();
		set_fs(KERNEL_DS);
		flags = O_WRONLY | O_CREAT;

		if (filename == NULL) {
			flags |= O_APPEND;
			switch (mfts_mode) {
			case 0:
				filename = fname;
				break;
			case 1:
				filename = fname_mfts_folder;
				break;
			case 2:
				filename = fname_mfts_flat;
				break;
			case 3:
				filename = fname_mfts_curved;
				break;
			default:
				TOUCH_I("%s : not support mfts_mode\n",
					__func__);
				break;
			}
		} else {
			cap_file_exist = 1;
		}

		if (filename) {
			file = filp_open(filename, flags, 0666);
		} else {
			TOUCH_E("%s : filename is NULL, can not open FILE\n",
				__func__);
			return -1;
		}

		if (IS_ERR(file)) {
			TOUCH_I("%s : ERR(%ld)  Open file error [%s]\n",
					__func__, PTR_ERR(file), filename);
			set_fs(old_fs);
			return PTR_ERR(file);
		}

		vfs_write(file, data, strlen(data), &pos);
		filp_close(file, 0);
		set_fs(old_fs);
	}
	return cap_file_exist;
}
void _write_time_log(char *filename, char *data, int data_include)
{
	struct file *file;
	loff_t pos = 0;
	char *fname = NULL;
	char time_string[64] = {0};
	struct timespec my_time;
	struct tm my_date;

	mm_segment_t old_fs = get_fs();

	my_time = __current_kernel_time();
	time_to_tm(my_time.tv_sec, sys_tz.tz_minuteswest * 60 * (-1), &my_date);
	snprintf(time_string,
			sizeof(time_string),
			"%02d-%02d %02d:%02d:%02d.%03lu\n\n",
			my_date.tm_mon + 1,
			my_date.tm_mday,
			my_date.tm_hour,
			my_date.tm_min,
			my_date.tm_sec,
			(unsigned long) my_time.tv_nsec / 1000000);

	set_fs(KERNEL_DS);

	if (filename == NULL) {
		switch (mfts_mode) {
		case 0:
			fname = "/mnt/sdcard/touch_self_test.txt";
			break;
		case 1:
			fname = "/mnt/sdcard/touch_self_test_mfts_folder.txt";
			break;
		case 2:
			fname = "/mnt/sdcard/touch_self_test_mfts_flat.txt";
			break;
		case 3:
			fname = "/mnt/sdcard/touch_self_test_mfts_curved.txt";
			break;
		default:
			TOUCH_I("%s : not support mfts_mode\n", __func__);
			break;
		}
	} else {
		fname = filename;
	}

	if (fname) {
		file = filp_open(fname,
			O_WRONLY|O_CREAT|O_APPEND, 0666);
	} else {
		TOUCH_E("%s : fname is NULL, can not open FILE\n", __func__);
		return;
	}

	if (IS_ERR(file)) {
		TOUCH_I("%s :  Open file error [%s], err = %ld\n",
				__func__, fname, PTR_ERR(file));

		set_fs(old_fs);
		return;
	}

	vfs_write(file, time_string, strlen(time_string), &pos);
	filp_close(file, 0);

	set_fs(old_fs);
}
static int ext_watch_font_dump(struct device *dev, char *font_dump)
{
	struct touch_core_data *ts = to_touch_core(dev);
	u32 font_sel = 0;
	u32 font_data_offset = 0;
	u32 wdata = 0;
	u32 size = 0;
	int ret = 0;

	if (!ts->xfer) {
		TOUCH_I("%s alloc failed\n", __func__);
		return -EIO;
	}

	TOUCH_I("%s start\n", __func__);

	ts->xfer->bits_per_word = 8;
	ts->xfer->msg_count = 2;

	/* Font memory access enable */
	wdata = 1;
	ret = lg4945_reg_write(dev, EXT_WATCH_FONT_ACC_EN,
		(u8 *)&wdata, sizeof(u32));
	if (ret)
		goto error;

	size = sizeof(u32) * EXT_WATCH_FONT_NUM_SIZE;

	for (font_sel = 0; font_sel < 10; font_sel++) {
		/* Font select : '0' ~ '9' */
		font_data_offset = font_sel * size;

		ts->xfer->data[0].tx.addr = EXT_WATCH_FONT_SEL;
		ts->xfer->data[0].tx.buf = (u8 *)&font_sel;
		ts->xfer->data[0].tx.size = sizeof(u32);
		ts->xfer->data[1].rx.addr = EXT_WATCH_FONT_OFFSET_ADDR;
		ts->xfer->data[1].rx.buf = font_dump + font_data_offset;
		ts->xfer->data[1].rx.size = size;
		lg4945_xfer_msg(dev, ts->xfer);
	}

	/* Font select : ':' */
	font_data_offset = font_sel * size;
	size = sizeof(u32) * EXT_WATCH_FONT_CHAR_SIZE;

	ts->xfer->data[0].tx.addr = EXT_WATCH_FONT_SEL;
	ts->xfer->data[0].tx.buf = (u8 *)&font_sel;
	ts->xfer->data[0].tx.size = sizeof(u32);
	ts->xfer->data[1].rx.addr = EXT_WATCH_FONT_OFFSET_ADDR;
	ts->xfer->data[1].rx.buf = font_dump + font_data_offset;
	ts->xfer->data[1].rx.size = size;
	lg4945_xfer_msg(dev, ts->xfer);

	/* Font memory access disable */
	wdata = 0;
	ret = lg4945_reg_write(dev, EXT_WATCH_FONT_ACC_EN,
		(u8 *)&wdata, sizeof(u32));
	if (ret)
		goto error;

	TOUCH_I("%s done\n", __func__);
	return ret;

error:
	TOUCH_E("fail %d\n", ret);
	return -EIO;
}