亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? i2c-s3c2410.c

?? 這個源碼相信對很多用arm開發板開發的人會有用的
?? C
?? 第 1 頁 / 共 2 頁
字號:
		if (!(iicstat & S3C2410_IICSTAT_BUSBUSY))			return 0;		msleep(1);	}	dev_dbg(i2c->dev, "timeout: GPEDAT is %08x\n",		__raw_readl(S3C2410_GPEDAT));	return -ETIMEDOUT;}/* s3c24xx_i2c_doxfer * * this starts an i2c transfer*/static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c *i2c, struct i2c_msg *msgs, int num){	unsigned long timeout;	int ret;	ret = s3c24xx_i2c_set_master(i2c);	if (ret != 0) {		dev_err(i2c->dev, "cannot get bus (error %d)\n", ret);		ret = -EAGAIN;		goto out;	}	spin_lock_irq(&i2c->lock);	i2c->msg     = msgs;	i2c->msg_num = num;	i2c->msg_ptr = 0;	i2c->msg_idx = 0;	i2c->state   = STATE_START;	s3c24xx_i2c_enable_irq(i2c);	s3c24xx_i2c_message_start(i2c, msgs);	spin_unlock_irq(&i2c->lock);		timeout = wait_event_timeout(i2c->wait, i2c->msg_num == 0, HZ * 5);	ret = i2c->msg_idx;	/* having these next two as dev_err() makes life very 	 * noisy when doing an i2cdetect */	if (timeout == 0)		dev_dbg(i2c->dev, "timeout\n");	else if (ret != num)		dev_dbg(i2c->dev, "incomplete xfer (%d)\n", ret);	/* ensure the stop has been through the bus */	msleep(1); out:	return ret;}/* s3c24xx_i2c_xfer * * first port of call from the i2c bus code when an message needs * transferring across the i2c bus.*/static int s3c24xx_i2c_xfer(struct i2c_adapter *adap,			struct i2c_msg *msgs, int num){	struct s3c24xx_i2c *i2c = (struct s3c24xx_i2c *)adap->algo_data;	int retry;	int ret;	for (retry = 0; retry < adap->retries; retry++) {		ret = s3c24xx_i2c_doxfer(i2c, msgs, num);		if (ret != -EAGAIN)			return ret;		dev_dbg(i2c->dev, "Retrying transmission (%d)\n", retry);		udelay(100);	}	return -EREMOTEIO;}/* declare our i2c functionality */static u32 s3c24xx_i2c_func(struct i2c_adapter *adap){	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_PROTOCOL_MANGLING;}/* i2c bus registration info */static struct i2c_algorithm s3c24xx_i2c_algorithm = {	.master_xfer		= s3c24xx_i2c_xfer,	.functionality		= s3c24xx_i2c_func,};static struct s3c24xx_i2c s3c24xx_i2c = {	.lock	= SPIN_LOCK_UNLOCKED,	.wait	= __WAIT_QUEUE_HEAD_INITIALIZER(s3c24xx_i2c.wait),	.adap	= {		.name			= "s3c2410-i2c",		.owner			= THIS_MODULE,		.algo			= &s3c24xx_i2c_algorithm,		.retries		= 2,		.class			= I2C_CLASS_HWMON,	},};/* s3c24xx_i2c_calcdivisor * * return the divisor settings for a given frequency*/static int s3c24xx_i2c_calcdivisor(unsigned long clkin, unsigned int wanted,				   unsigned int *div1, unsigned int *divs){	unsigned int calc_divs = clkin / wanted;	unsigned int calc_div1;	if (calc_divs > (16*16))		calc_div1 = 512;	else		calc_div1 = 16;	calc_divs += calc_div1-1;	calc_divs /= calc_div1;	if (calc_divs == 0)		calc_divs = 1;	if (calc_divs > 17)		calc_divs = 17;	*divs = calc_divs;	*div1 = calc_div1;	return clkin / (calc_divs * calc_div1);}/* freq_acceptable * * test wether a frequency is within the acceptable range of error*/static inline int freq_acceptable(unsigned int freq, unsigned int wanted){	int diff = freq - wanted;	return (diff >= -2 && diff <= 2);}/* s3c24xx_i2c_getdivisor * * work out a divisor for the user requested frequency setting, * either by the requested frequency, or scanning the acceptable * range of frequencies until something is found*/static int s3c24xx_i2c_getdivisor(struct s3c24xx_i2c *i2c,				  struct s3c2410_platform_i2c *pdata,				  unsigned long *iicon,				  unsigned int *got){	unsigned long clkin = clk_get_rate(i2c->clk);		unsigned int divs, div1;	int freq;	int start, end;	clkin /= 1000;		/* clkin now in KHz */     	dev_dbg(i2c->dev,  "pdata %p, freq %lu %lu..%lu\n",		 pdata, pdata->bus_freq, pdata->min_freq, pdata->max_freq);	if (pdata->bus_freq != 0) {		freq = s3c24xx_i2c_calcdivisor(clkin, pdata->bus_freq/1000,					       &div1, &divs);		if (freq_acceptable(freq, pdata->bus_freq/1000))			goto found;	}	/* ok, we may have to search for something suitable... */	start = (pdata->max_freq == 0) ? pdata->bus_freq : pdata->max_freq;	end = pdata->min_freq;	start /= 1000;	end /= 1000;	/* search loop... */	for (; start > end; start--) {		freq = s3c24xx_i2c_calcdivisor(clkin, start, &div1, &divs);		if (freq_acceptable(freq, start))			goto found;	}	/* cannot find frequency spec */	return -EINVAL; found:	*got = freq;	*iicon |= (divs-1);	*iicon |= (div1 == 512) ? S3C2410_IICCON_TXDIV_512 : 0;	return 0;}/* s3c24xx_i2c_init * * initialise the controller, set the IO lines and frequency */static int s3c24xx_i2c_init(struct s3c24xx_i2c *i2c){	unsigned long iicon = S3C2410_IICCON_IRQEN | S3C2410_IICCON_ACKEN;	struct s3c2410_platform_i2c *pdata;	unsigned int freq;	/* get the plafrom data */	pdata = s3c24xx_i2c_get_platformdata(i2c->adap.dev.parent);	/* inititalise the gpio */	s3c2410_gpio_cfgpin(S3C2410_GPE15, S3C2410_GPE15_IICSDA);	s3c2410_gpio_cfgpin(S3C2410_GPE14, S3C2410_GPE14_IICSCL);	/* write slave address */		writeb(pdata->slave_addr, i2c->regs + S3C2410_IICADD);	dev_info(i2c->dev, "slave address 0x%02x\n", pdata->slave_addr);	/* we need to work out the divisors for the clock... */	if (s3c24xx_i2c_getdivisor(i2c, pdata, &iicon, &freq) != 0) {		dev_err(i2c->dev, "cannot meet bus frequency required\n");		return -EINVAL;	}	/* todo - check that the i2c lines aren't being dragged anywhere */	dev_info(i2c->dev, "bus frequency set to %d KHz\n", freq);	dev_dbg(i2c->dev, "S3C2410_IICCON=0x%02lx\n", iicon);		writel(iicon, i2c->regs + S3C2410_IICCON);	/* check for s3c2440 i2c controller  */	if (s3c24xx_i2c_is2440(i2c)) {		dev_dbg(i2c->dev, "S3C2440_IICLC=%08x\n", pdata->sda_delay);		writel(pdata->sda_delay, i2c->regs + S3C2440_IICLC);	}	return 0;}static void s3c24xx_i2c_free(struct s3c24xx_i2c *i2c){	if (i2c->clk != NULL && !IS_ERR(i2c->clk)) {		clk_disable(i2c->clk);		clk_unuse(i2c->clk);		clk_put(i2c->clk);		i2c->clk = NULL;	}	if (i2c->regs != NULL) {		iounmap(i2c->regs);		i2c->regs = NULL;	}	if (i2c->ioarea != NULL) {		release_resource(i2c->ioarea);		kfree(i2c->ioarea);		i2c->ioarea = NULL;	}}/* s3c24xx_i2c_probe * * called by the bus driver when a suitable device is found*/static int s3c24xx_i2c_probe(struct platform_device *pdev){	struct s3c24xx_i2c *i2c = &s3c24xx_i2c;	struct resource *res;	int ret;	/* find the clock and enable it */	i2c->dev = &pdev->dev;	i2c->clk = clk_get(&pdev->dev, "i2c");	if (IS_ERR(i2c->clk)) {		dev_err(&pdev->dev, "cannot get clock\n");		ret = -ENOENT;		goto out;	}	dev_dbg(&pdev->dev, "clock source %p\n", i2c->clk);	clk_use(i2c->clk);	clk_enable(i2c->clk);	/* map the registers */	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);	if (res == NULL) {		dev_err(&pdev->dev, "cannot find IO resource\n");		ret = -ENOENT;		goto out;	}	i2c->ioarea = request_mem_region(res->start, (res->end-res->start)+1,					 pdev->name);	if (i2c->ioarea == NULL) {		dev_err(&pdev->dev, "cannot request IO\n");		ret = -ENXIO;		goto out;	}	i2c->regs = ioremap(res->start, (res->end-res->start)+1);	if (i2c->regs == NULL) {		dev_err(&pdev->dev, "cannot map IO\n");		ret = -ENXIO;		goto out;	}	dev_dbg(&pdev->dev, "registers %p (%p, %p)\n", i2c->regs, i2c->ioarea, res);	/* setup info block for the i2c core */	i2c->adap.algo_data = i2c;	i2c->adap.dev.parent = &pdev->dev;	/* initialise the i2c controller */	ret = s3c24xx_i2c_init(i2c);	if (ret != 0)		goto out;	/* find the IRQ for this unit (note, this relies on the init call to	 * ensure no current IRQs pending 	 */	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);	if (res == NULL) {		dev_err(&pdev->dev, "cannot find IRQ\n");		ret = -ENOENT;		goto out;	}	ret = request_irq(res->start, s3c24xx_i2c_irq, SA_INTERRUPT,			  pdev->name, i2c);	if (ret != 0) {		dev_err(&pdev->dev, "cannot claim IRQ\n");		goto out;	}	i2c->irq = res;			dev_dbg(&pdev->dev, "irq resource %p (%ld)\n", res, res->start);	ret = i2c_add_adapter(&i2c->adap);	if (ret < 0) {		dev_err(&pdev->dev, "failed to add bus to i2c core\n");		goto out;	}	platform_set_drvdata(pdev, i2c);	dev_info(&pdev->dev, "%s: S3C I2C adapter\n", i2c->adap.dev.bus_id); out:	if (ret < 0)		s3c24xx_i2c_free(i2c);	return ret;}/* s3c24xx_i2c_remove * * called when device is removed from the bus*/static int s3c24xx_i2c_remove(struct platform_device *pdev){	struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev);		if (i2c != NULL) {		s3c24xx_i2c_free(i2c);		platform_set_drvdata(pdev, NULL);	}	return 0;}#ifdef CONFIG_PMstatic int s3c24xx_i2c_resume(struct platform_device *dev){	struct s3c24xx_i2c *i2c = platform_get_drvdata(dev);	if (i2c != NULL)		s3c24xx_i2c_init(i2c);	return 0;}#else#define s3c24xx_i2c_resume NULL#endif/* device driver for platform bus bits */static struct platform_driver s3c2410_i2c_driver = {	.probe		= s3c24xx_i2c_probe,	.remove		= s3c24xx_i2c_remove,	.resume		= s3c24xx_i2c_resume,	.driver		= {		.owner	= THIS_MODULE,		.name	= "s3c2410-i2c",	},};static struct platform_driver s3c2440_i2c_driver = {	.probe		= s3c24xx_i2c_probe,	.remove		= s3c24xx_i2c_remove,	.resume		= s3c24xx_i2c_resume,	.driver		= {		.owner	= THIS_MODULE,		.name	= "s3c2440-i2c",	},};static int __init i2c_adap_s3c_init(void){	int ret;	ret = platform_driver_register(&s3c2410_i2c_driver);	if (ret == 0) {		ret = platform_driver_register(&s3c2440_i2c_driver);		if (ret)			platform_driver_unregister(&s3c2410_i2c_driver);	}	return ret;}static void __exit i2c_adap_s3c_exit(void){	platform_driver_unregister(&s3c2410_i2c_driver);	platform_driver_unregister(&s3c2440_i2c_driver);}module_init(i2c_adap_s3c_init);module_exit(i2c_adap_s3c_exit);MODULE_DESCRIPTION("S3C24XX I2C Bus driver");MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天天综合天天综合色| 免费在线欧美视频| 国产成人a级片| 久久综合网色—综合色88| 日韩中文字幕av电影| 日韩三级视频在线观看| 极品少妇xxxx精品少妇| 2020国产成人综合网| 福利一区二区在线观看| 中文字幕日韩一区二区| 色婷婷一区二区三区四区| 丝袜美腿亚洲一区| 久久久久久97三级| 欧美肥大bbwbbw高潮| 国产在线精品一区二区不卡了| 国产日产亚洲精品系列| 91视频xxxx| 国产精品99久久久久久宅男| 中文字幕一区二区三区四区不卡 | 国产精品天干天干在线综合| 欧美在线观看一区| 成人精品鲁一区一区二区| 午夜影院在线观看欧美| 国产精品国产三级国产专播品爱网| 欧美日韩国产片| 粉嫩高潮美女一区二区三区| 久久精品99久久久| 午夜欧美大尺度福利影院在线看| 国产女人aaa级久久久级| 精品国产伦一区二区三区免费| 欧美日韩国产免费| 成人精品免费看| 日韩国产欧美在线播放| 舔着乳尖日韩一区| 日日骚欧美日韩| 日韩精品乱码av一区二区| 一级精品视频在线观看宜春院| 国产精品久久三区| 亚洲视频一区二区在线观看| 中文字幕的久久| 成人免费在线视频| 一区二区三区在线观看视频| 亚洲桃色在线一区| 亚洲一区二区五区| 午夜精品aaa| 国产盗摄女厕一区二区三区| 国产福利一区二区| 99精品国产91久久久久久| 色综合天天综合色综合av| 欧美三级日韩三级| 国产农村妇女毛片精品久久麻豆| 国产精品无码永久免费888| 中文字幕中文字幕一区二区| 亚洲一区电影777| 国产一区二区三区免费| 91激情在线视频| 日韩精品自拍偷拍| 亚洲综合丁香婷婷六月香| 老司机精品视频线观看86| 色综合久久综合网| 欧美国产一区二区在线观看 | 亚洲国产精品传媒在线观看| 一区二区三区中文字幕电影| 偷拍一区二区三区| 在线免费观看日韩欧美| 亚洲国产精品高清| 国产精品资源网站| 欧美日韩的一区二区| 亚洲女人的天堂| 91女神在线视频| 国产情人综合久久777777| 香港成人在线视频| 欧美日本一区二区在线观看| 国产精品影视在线观看| 在线播放视频一区| 色94色欧美sute亚洲线路二 | 午夜国产精品一区| 在线免费不卡视频| 亚洲在线观看免费| 欧美亚洲国产怡红院影院| 中文字幕中文字幕在线一区 | 制服丝袜一区二区三区| 亚洲色图欧美偷拍| 欧洲精品视频在线观看| 日韩欧美国产不卡| 亚洲成av人片观看| 一本久久综合亚洲鲁鲁五月天| 久久蜜桃香蕉精品一区二区三区| 国产一区二区不卡| 在线看日本不卡| 亚洲6080在线| 久久蜜桃一区二区| 一本大道av伊人久久综合| 午夜私人影院久久久久| 久久日韩粉嫩一区二区三区| 99国产精品久久| 奇米在线7777在线精品| 国产精品私房写真福利视频| 欧美日韩一区精品| 粉嫩嫩av羞羞动漫久久久| 亚洲夂夂婷婷色拍ww47| 国产精品乱人伦中文| 在线观看视频一区二区欧美日韩| 九九九久久久精品| 亚洲国产欧美日韩另类综合| 国产色91在线| 日韩美女视频在线| 欧美日韩精品一区二区天天拍小说| 久久精品国产亚洲一区二区三区| 国产精品国产a| 国产精品免费看片| 精品国内片67194| 欧美一级淫片007| 在线91免费看| 欧美日韩电影在线播放| 欧美在线你懂的| 欧美日韩一区二区电影| 欧美熟乱第一页| 在线观看www91| 欧美一级黄色大片| 欧美久久久久久久久中文字幕| 99re成人在线| 欧美三级三级三级爽爽爽| 在线精品视频免费播放| 97成人超碰视| 欧美高清视频一二三区 | 一本色道久久综合狠狠躁的推荐| fc2成人免费人成在线观看播放 | 在线观看视频91| 51精品久久久久久久蜜臀| 亚洲精品一区二区三区香蕉| 精品国产在天天线2019| 欧美激情在线一区二区| 亚洲欧洲日本在线| 午夜久久电影网| 极品美女销魂一区二区三区| 国产成人啪免费观看软件| 91麻豆.com| 26uuu久久综合| 亚洲成a人v欧美综合天堂| 免费观看日韩av| 欧美日韩精品系列| 中文字幕不卡在线| 美脚の诱脚舐め脚责91 | 欧美日韩国产一级| 国产精品午夜在线| 麻豆国产精品官网| 91国在线观看| 亚洲另类色综合网站| 国产精品一区二区三区乱码| 欧美乱熟臀69xxxxxx| 亚洲人成7777| 成人毛片老司机大片| 久久精品亚洲精品国产欧美| 午夜a成v人精品| 91.麻豆视频| 午夜精品一区二区三区电影天堂| 成人高清伦理免费影院在线观看| 欧美一区二区三区在线观看视频 | 欧美色爱综合网| 亚洲伦理在线精品| 91福利在线播放| 亚洲午夜精品网| 欧美一级xxx| 久久er精品视频| 国产精品美女久久久久久| 国产1区2区3区精品美女| 亚洲国产精品ⅴa在线观看| 国产91对白在线观看九色| 国产精品女同一区二区三区| 国产成人在线视频免费播放| 国产精品久久久久久久久久久免费看| 欧美日韩亚洲不卡| 五月天中文字幕一区二区| 欧美精品一二三区| 国精产品一区一区三区mba视频| 久久久精品免费免费| 99久久免费国产| 日本麻豆一区二区三区视频| 久久精品欧美一区二区三区不卡 | 成人在线视频首页| 一区二区三区四区乱视频| 日韩免费高清视频| 色综合久久久久| 国产剧情av麻豆香蕉精品| 中文字幕一区二区三区四区不卡| 欧美一区二区三区日韩视频| 不卡视频免费播放| 国产一区二区三区精品视频| 亚洲黄色尤物视频| 欧美激情一二三区| 国产色产综合色产在线视频| 欧美日本视频在线| 在线视频亚洲一区| 99综合电影在线视频| 久久www免费人成看片高清| 日韩精品1区2区3区| 亚洲风情在线资源站| 亚洲一二三四在线观看| 玉米视频成人免费看|