1 #include <linux/kernel.h>
2 #include <linux/module.h>
3 #include <linux/delay.h>
4 #include <linux/mfd/core.h>
5 #include <linux/slab.h>
6 #include <linux/mfd/rk616.h>
7 #include <mach/iomux.h>
9 #include <linux/uaccess.h>
10 #if defined(CONFIG_DEBUG_FS)
12 #include <linux/debugfs.h>
13 #include <linux/seq_file.h>
17 #define MHZ (1000*1000)
20 static struct mfd_cell rk616_devs[] = {
26 .name = "rk616-codec",
39 static int rk616_i2c_read_reg(struct mfd_rk616 *rk616, u16 reg,u32 *pval)
41 struct i2c_client * client = rk616->client;
42 struct i2c_adapter *adap = client->adapter;
43 struct i2c_msg msgs[2];
47 memcpy(reg_buf, ®, 2);
49 msgs[0].addr = client->addr;
50 msgs[0].flags = client->flags;
52 msgs[0].buf = reg_buf;
53 msgs[0].scl_rate = rk616->pdata->scl_rate;
54 msgs[0].udelay = client->udelay;
56 msgs[1].addr = client->addr;
57 msgs[1].flags = client->flags | I2C_M_RD;
59 msgs[1].buf = (char *)pval;
60 msgs[1].scl_rate = rk616->pdata->scl_rate;
61 msgs[1].udelay = client->udelay;
63 ret = i2c_transfer(adap, msgs, 2);
66 return (ret == 2)? 4 : ret;
70 static int rk616_i2c_write_reg(struct mfd_rk616 *rk616, u16 reg,u32 *pval)
72 struct i2c_client *client = rk616->client;
73 struct i2c_adapter *adap = client->adapter;
76 char *tx_buf = (char *)kmalloc(6, GFP_KERNEL);
80 memcpy(tx_buf, ®, 2);
81 memcpy(tx_buf+2, (char *)pval, 4);
83 msg.addr = client->addr;
84 msg.flags = client->flags;
86 msg.buf = (char *)tx_buf;
87 msg.scl_rate = rk616->pdata->scl_rate;
88 msg.udelay = client->udelay;
90 ret = i2c_transfer(adap, &msg, 1);
93 return (ret == 1) ? 4 : ret;
97 static int rk616_i2c_write_bits(struct mfd_rk616 *rk616, u16 reg,u32 mask,u32 *pval)
100 struct i2c_client *client = rk616->client;
101 struct i2c_adapter *adap = client->adapter;
107 tx_buf = (char *)kmalloc(6, GFP_KERNEL);
111 mutex_lock(&rk616->reg_lock);
112 rk616->read_dev(rk616,reg,®_val);
117 memcpy(tx_buf, ®, 2);
118 memcpy(tx_buf+2, (char *)pval, 4);
120 msg.addr = client->addr;
121 msg.flags = client->flags;
123 msg.buf = (char *)tx_buf;
124 msg.scl_rate = rk616->pdata->scl_rate;
125 msg.udelay = client->udelay;
127 ret = i2c_transfer(adap, &msg, 1);
129 mutex_unlock(&rk616->reg_lock);
131 return (ret == 1) ? 4 : ret;
133 #if defined(CONFIG_DEBUG_FS)
134 static int rk616_reg_show(struct seq_file *s, void *v)
138 struct mfd_rk616 *rk616 = s->private;
141 dev_err(rk616->dev,"no mfd rk616!\n");
145 for(i=0;i<= CRU_CFGMISC_CON;i+=4)
147 rk616->read_dev(rk616,i,&val);
149 seq_printf(s,"\n0x%04x:",i);
150 seq_printf(s," %08x",val);
157 static ssize_t rk616_reg_write (struct file *file, const char __user *buf, size_t count, loff_t *ppos)
159 struct mfd_rk616 *rk616 = file->f_path.dentry->d_inode->i_private;
164 if (copy_from_user(kbuf, buf, count))
166 sscanf(kbuf, "%x%x", ®,&val);
167 rk616->write_dev(rk616,reg,&val);
171 static int rk616_reg_open(struct inode *inode, struct file *file)
173 struct mfd_rk616 *rk616 = inode->i_private;
174 return single_open(file,rk616_reg_show,rk616);
177 static const struct file_operations rk616_reg_fops = {
178 .owner = THIS_MODULE,
179 .open = rk616_reg_open,
181 .write = rk616_reg_write,
183 .release = single_release,
188 static u32 rk616_clk_gcd(u32 numerator, u32 denominator)
192 if (!numerator || !denominator)
195 if (numerator > denominator) {
213 static int rk616_pll_par_calc(u32 fin_hz,u32 fout_hz,u32 *refdiv, u32 *fbdiv,
214 u32 *postdiv1, u32 *postdiv2, u32 *frac)
216 // FIXME set postdiv1/2 always 1
220 if(!fin_hz || !fout_hz)
223 if(fin_hz / MHZ * MHZ == fin_hz && fout_hz /MHZ * MHZ == fout_hz)
227 gcd = rk616_clk_gcd(fin_hz, fout_hz);
228 *refdiv = fin_hz / gcd;
229 *fbdiv = fout_hz / gcd;
239 gcd = rk616_clk_gcd(fin_hz / MHZ, fout_hz / MHZ);
240 *refdiv = fin_hz / MHZ / gcd;
241 *fbdiv = fout_hz / MHZ / gcd;
247 f_frac = (fout_hz % MHZ);
249 do_div(fin_64, (u64)*refdiv);
250 frac_64 = (u64)f_frac << 24;
251 do_div(frac_64, fin_64);
252 *frac = (u32) frac_64;
253 printk(KERN_INFO "frac_64=%llx, frac=%u\n", frac_64, *frac);
255 printk(KERN_INFO "fin=%u,fout=%u,gcd=%u,refdiv=%u,fbdiv=%u,postdiv1=%u,postdiv2=%u,frac=%u\n",
256 fin_hz, fout_hz, gcd, *refdiv, *fbdiv, *postdiv1, *postdiv2, *frac);
261 static int rk616_pll_wait_lock(struct mfd_rk616 *rk616,int id)
278 ret = rk616->read_dev(rk616,CRU_PLL0_CON1 + offset,&val);
281 rk616_dbg(rk616->dev,"PLL%d locked\n",id);
289 dev_err(rk616->dev,"rk616 wait PLL%d lock time out!\n",id);
297 int rk616_pll_pwr_down(struct mfd_rk616 *rk616,int id)
312 val = PLL0_PWR_DN | (PLL0_PWR_DN << 16);
313 ret = rk616->write_dev(rk616,CRU_PLL0_CON1 + offset,&val);
321 int rk616_pll_set_rate(struct mfd_rk616 *rk616,int id,u32 cfg_val,u32 frac)
326 u16 con0 = cfg_val & 0xffff;
327 u16 con1 = (cfg_val >> 16)&0xffff;
328 u32 fbdiv = con0 & 0xfff;
329 u32 postdiv1 = (con0 >> 12)&0x7;
330 u32 refdiv = con1 & 0x3f;
331 u32 postdiv2 = (con1 >> 6) & 0x7;
336 if(((rk616->pll0_rate >> 32) == cfg_val) &&
337 ((rk616->pll0_rate & 0xffffffff) == frac))
341 rk616->pll0_rate = ((u64)cfg_val << 32) | frac;
346 if(((rk616->pll1_rate >> 32) == cfg_val) &&
347 ((rk616->pll1_rate & 0xffffffff) == frac))
351 rk616->pll1_rate = ((u64)cfg_val << 32) | frac;
356 val = PLL0_PWR_DN | (PLL0_PWR_DN << 16);
357 ret = rk616->write_dev(rk616,CRU_PLL0_CON1 + offset,&val);
360 ret = rk616->read_dev(rk616,CRU_PLL0_CON2 + offset,&val);
363 val |= PLL0_FRAC(frac);
365 val |= 0x800000; //default value
366 ret = rk616->write_dev(rk616,CRU_PLL0_CON2 + offset,&val);
368 val = PLL0_POSTDIV1(postdiv1) | PLL0_FBDIV(fbdiv) | PLL0_POSTDIV1_MASK |
369 PLL0_FBDIV_MASK | (PLL0_BYPASS << 16);
370 ret = rk616->write_dev(rk616,CRU_PLL0_CON0 + offset,&val);
372 val = PLL0_DIV_MODE(mode) | PLL0_POSTDIV2(postdiv2) | PLL0_REFDIV(refdiv) |
373 (PLL0_DIV_MODE_MASK) | PLL0_POSTDIV2_MASK | PLL0_REFDIV_MASK;
374 ret = rk616->write_dev(rk616,CRU_PLL0_CON1 + offset,&val);
376 val = (PLL0_PWR_DN << 16);
377 ret = rk616->write_dev(rk616,CRU_PLL0_CON1 + offset,&val);
379 rk616_pll_wait_lock(rk616,id);
386 /***********************************
387 default clk patch settiing:
389 LCD_DCLK0--->PLL0--->Dither--->LVDS/MIPI
390 LCD_DCLK1--->PLL1--->HDMI
391 ************************************/
393 static int rk616_clk_common_init(struct mfd_rk616 *rk616)
398 val = PLL1_CLK_SEL(LCD1_DCLK) | PLL0_CLK_SEL(LCD0_DCLK) | LCD1_CLK_DIV(0) |
399 LCD0_CLK_DIV(0) | PLL1_CLK_SEL_MASK | PLL0_CLK_SEL_MASK |
400 LCD1_CLK_DIV_MASK | LCD0_CLK_DIV_MASK; //pll1 clk from lcdc1_dclk,pll0 clk from lcdc0_dclk,mux_lcdx = lcdx_clk
401 ret = rk616->write_dev(rk616,CRU_CLKSEL0_CON,&val);
403 val = SCLK_SEL(SCLK_SEL_PLL1) | CODEC_MCLK_SEL(CODEC_MCLK_SEL_12M) |
404 CODEC_MCLK_SEL_MASK | SCLK_SEL_MASK; //codec mclk from clkin
405 ret = rk616->write_dev(rk616,CRU_CLKSEL1_CON,&val);
407 val = 0; //codec mck = clkin
408 ret = rk616->write_dev(rk616,CRU_CODEC_DIV,&val);
410 val = (PLL0_BYPASS) | (PLL0_BYPASS << 16); //bypass pll0
411 ret = rk616->write_dev(rk616,CRU_PLL0_CON0,&val);
412 val = PLL0_PWR_DN | (PLL0_PWR_DN << 16);
413 ret = rk616->write_dev(rk616,CRU_PLL0_CON1,&val); //power down pll0
415 val = (PLL1_BYPASS) | (PLL1_BYPASS << 16);
416 ret = rk616->write_dev(rk616,CRU_PLL1_CON0,&val);
422 static int rk616_core_suspend(struct device *dev, pm_message_t state)
427 static int rk616_core_resume(struct device* dev)
429 struct mfd_rk616 *rk616 = dev_get_drvdata(dev);
430 rk616_clk_common_init(rk616);
433 static int rk616_i2c_probe(struct i2c_client *client,const struct i2c_device_id *id)
436 struct mfd_rk616 *rk616 = NULL;
439 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
441 dev_err(&client->dev, "Must have I2C_FUNC_I2C.\n");
444 rk616 = kzalloc(sizeof(struct mfd_rk616), GFP_KERNEL);
447 printk(KERN_ALERT "alloc for struct rk616 fail\n");
451 rk616->dev = &client->dev;
452 rk616->pdata = client->dev.platform_data;
453 rk616->client = client;
454 i2c_set_clientdata(client, rk616);
455 dev_set_drvdata(rk616->dev,rk616);
457 #if defined(CONFIG_SND_RK29_SOC_I2S_8CH)
458 iis_clk = clk_get_sys("rk29_i2s.0", "i2s");
459 #elif defined(CONFIG_SND_RK29_SOC_I2S_2CH)
460 iis_clk = clk_get_sys("rk29_i2s.1", "i2s");
462 iis_clk = clk_get_sys("rk29_i2s.2", "i2s");
466 dev_err(&client->dev,"failed to get i2s clk\n");
467 ret = PTR_ERR(iis_clk);
471 rk616->mclk = iis_clk;
473 #if defined(CONFIG_ARCH_RK29)
474 rk29_mux_api_set(GPIO2D0_I2S0CLK_MIIRXCLKIN_NAME, GPIO2H_I2S0_CLK);
479 clk_set_rate(iis_clk, 11289600);
483 mutex_init(&rk616->reg_lock);
485 if(rk616->pdata->power_init)
486 rk616->pdata->power_init();
488 rk616->read_dev = rk616_i2c_read_reg;
489 rk616->write_dev = rk616_i2c_write_reg;
490 rk616->write_dev_bits = rk616_i2c_write_bits;
492 #if defined(CONFIG_DEBUG_FS)
493 rk616->debugfs_dir = debugfs_create_dir("rk616", NULL);
494 if (IS_ERR(rk616->debugfs_dir))
496 dev_err(rk616->dev,"failed to create debugfs dir for rk616!\n");
499 debugfs_create_file("core", S_IRUSR,rk616->debugfs_dir,rk616,&rk616_reg_fops);
501 rk616_clk_common_init(rk616);
502 ret = mfd_add_devices(rk616->dev, -1,
503 rk616_devs, ARRAY_SIZE(rk616_devs),
504 NULL, rk616->irq_base);
505 dev_info(&client->dev,"rk616 core probe success!\n");
509 static int __devexit rk616_i2c_remove(struct i2c_client *client)
514 static void rk616_core_shutdown(struct i2c_client *client)
516 struct mfd_rk616 *rk616 = i2c_get_clientdata(client);
517 if(rk616->pdata->power_deinit)
518 rk616->pdata->power_deinit();
522 static const struct i2c_device_id id_table[] = {
527 static struct i2c_driver rk616_i2c_driver = {
530 .owner = THIS_MODULE,
531 .suspend = &rk616_core_suspend,
532 .resume = &rk616_core_resume,
534 .probe = &rk616_i2c_probe,
535 .remove = &rk616_i2c_remove,
536 .shutdown = &rk616_core_shutdown,
537 .id_table = id_table,
541 static int __init rk616_module_init(void)
543 return i2c_add_driver(&rk616_i2c_driver);
546 static void __exit rk616_module_exit(void)
548 i2c_del_driver(&rk616_i2c_driver);
551 subsys_initcall_sync(rk616_module_init);
552 module_exit(rk616_module_exit);