2 #include <linux/kernel.h>
3 #include <linux/module.h>
4 #include <linux/delay.h>
5 #include <linux/mfd/core.h>
6 #include <linux/slab.h>
7 #include <linux/mfd/rk616.h>
9 #include <mach/iomux.h>
10 #include <linux/err.h>
11 #include <linux/uaccess.h>
12 #if defined(CONFIG_DEBUG_FS)
14 #include <linux/debugfs.h>
15 #include <linux/seq_file.h>
19 static struct mfd_cell rk616_devs[] = {
25 .name = "rk616-codec",
38 static int rk616_i2c_read_reg(struct mfd_rk616 *rk616, u16 reg,u32 *pval)
40 struct i2c_client * client = rk616->client;
41 struct i2c_adapter *adap = client->adapter;
42 struct i2c_msg msgs[2];
46 memcpy(reg_buf, ®, 2);
48 msgs[0].addr = client->addr;
49 msgs[0].flags = client->flags;
51 msgs[0].buf = reg_buf;
52 msgs[0].scl_rate = rk616->pdata->scl_rate;
53 msgs[0].udelay = client->udelay;
55 msgs[1].addr = client->addr;
56 msgs[1].flags = client->flags | I2C_M_RD;
58 msgs[1].buf = (char *)pval;
59 msgs[1].scl_rate = rk616->pdata->scl_rate;
60 msgs[1].udelay = client->udelay;
62 ret = i2c_transfer(adap, msgs, 2);
65 return (ret == 2)? 4 : ret;
69 static int rk616_i2c_write_reg(struct mfd_rk616 *rk616, u16 reg,u32 *pval)
71 struct i2c_client *client = rk616->client;
72 struct i2c_adapter *adap = client->adapter;
75 char *tx_buf = (char *)kmalloc(6, GFP_KERNEL);
79 memcpy(tx_buf, ®, 2);
80 memcpy(tx_buf+2, (char *)pval, 4);
82 msg.addr = client->addr;
83 msg.flags = client->flags;
85 msg.buf = (char *)tx_buf;
86 msg.scl_rate = rk616->pdata->scl_rate;
87 msg.udelay = client->udelay;
89 ret = i2c_transfer(adap, &msg, 1);
93 return (ret == 1) ? 4 : ret;
97 #if defined(CONFIG_DEBUG_FS)
98 static int rk616_reg_show(struct seq_file *s, void *v)
102 struct mfd_rk616 *rk616 = s->private;
105 dev_err(rk616->dev,"no mfd rk616!\n");
109 for(i=0;i<= CRU_CFGMISC_CON;i+=4)
111 rk616->read_dev(rk616,i,&val);
112 seq_printf(s,"0x%04x>>0x%08x\n",i,val);
118 static ssize_t rk616_reg_write (struct file *file, const char __user *buf, size_t count, loff_t *ppos)
120 struct mfd_rk616 *rk616 = file->f_path.dentry->d_inode->i_private;
124 if (copy_from_user(kbuf, buf, count))
126 sscanf(kbuf, "%x%x", ®,&val);
127 dev_dbg(rk616->dev,"%s:reg:0x%04x val:0x%08x\n",__func__,reg,val);
128 rk616->write_dev(rk616,reg,&val);
132 static int rk616_reg_open(struct inode *inode, struct file *file)
134 struct mfd_rk616 *rk616 = inode->i_private;
135 return single_open(file,rk616_reg_show,rk616);
138 static const struct file_operations rk616_reg_fops = {
139 .owner = THIS_MODULE,
140 .open = rk616_reg_open,
142 .write = rk616_reg_write,
144 .release = single_release,
148 /***********************************
149 default clk patch settiing:
151 LCD_DCLK0--->PLL0--->Dither--->LVDS/MIPI
152 LCD_DCLK1--->PLL1--->HDMI
153 ************************************/
155 static int rk616_clk_common_init(struct mfd_rk616 *rk616)
160 val = PLL1_CLK_SEL(1) | PLL0_CLK_SEL(0) | LCD1_CLK_DIV(0) | LCD0_CLK_DIV(0) |
161 PLL1_CLK_SEL_MASK | PLL0_CLK_SEL_MASK | LCD1_CLK_DIV_MASK |
162 LCD0_CLK_DIV_MASK; //pll1 clk from lcdc1_dclk,pll0 clk from lcdc0_dclk,mux_lcdx = lcdx_clk
163 ret = rk616->write_dev(rk616,CRU_CLKSEL0_CON,&val);
165 val = CODEC_MCLK_SEL(2) | CODEC_MCLK_SEL_MASK; //codec mclk from clkin
166 ret = rk616->write_dev(rk616,CRU_CLKSEL1_CON,&val);
168 val = 0; //codec mck = clkin
169 ret = rk616->write_dev(rk616,CRU_CODEC_DIV,&val);
171 val = (PLL0_BYPASS) | (PLL0_BYPASS << 16); //bypass pll0
172 ret = rk616->write_dev(rk616,CRU_PLL0_CON0,&val);
174 val = (PLL1_BYPASS) | (PLL1_BYPASS << 16);
175 ret = rk616->write_dev(rk616,CRU_PLL1_CON0,&val);
179 static int rk616_i2c_probe(struct i2c_client *client,const struct i2c_device_id *id)
182 struct mfd_rk616 *rk616 = NULL;
185 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
187 dev_err(&client->dev, "Must have I2C_FUNC_I2C.\n");
190 rk616 = kzalloc(sizeof(struct mfd_rk616), GFP_KERNEL);
193 printk(KERN_ALERT "alloc for struct rk616 fail\n");
197 rk616->dev = &client->dev;
198 rk616->pdata = client->dev.platform_data;
199 rk616->client = client;
200 i2c_set_clientdata(client, rk616);
201 dev_set_drvdata(rk616->dev,rk616);
203 if(rk616->pdata->power_init)
204 rk616->pdata->power_init();
206 #if defined(CONFIG_SND_RK29_SOC_I2S_8CH)
207 iis_clk = clk_get_sys("rk29_i2s.0", "i2s");
208 #elif defined(CONFIG_SND_RK29_SOC_I2S_2CH)
209 iis_clk = clk_get_sys("rk29_i2s.1", "i2s");
211 iis_clk = clk_get_sys("rk29_i2s.2", "i2s");
215 dev_err(&client->dev,"failed to get i2s clk\n");
216 ret = PTR_ERR(iis_clk);
220 #if defined(CONFIG_ARCH_RK29)
221 rk29_mux_api_set(GPIO2D0_I2S0CLK_MIIRXCLKIN_NAME, GPIO2H_I2S0_CLK);
226 clk_set_rate(iis_clk, 11289600);
229 rk616->read_dev = rk616_i2c_read_reg;
230 rk616->write_dev = rk616_i2c_write_reg;
231 #if defined(CONFIG_DEBUG_FS)
232 debugfs_create_file("rk616-reg", S_IRUSR,NULL,rk616,&rk616_reg_fops);
234 rk616_clk_common_init(rk616);
235 ret = mfd_add_devices(rk616->dev, -1,
236 rk616_devs, ARRAY_SIZE(rk616_devs),
237 NULL, rk616->irq_base);
239 dev_info(&client->dev,"rk616 core probe success!\n");
243 static int __devexit rk616_i2c_remove(struct i2c_client *client)
248 static const struct i2c_device_id id_table[] = {
253 static struct i2c_driver rk616_i2c_driver = {
256 .owner = THIS_MODULE,
258 .probe = &rk616_i2c_probe,
259 .remove = &rk616_i2c_remove,
260 .id_table = id_table,
264 static int __init rk616_module_init(void)
266 return i2c_add_driver(&rk616_i2c_driver);
269 static void __exit rk616_module_exit(void)
271 i2c_del_driver(&rk616_i2c_driver);
274 subsys_initcall_sync(rk616_module_init);
275 module_exit(rk616_module_exit);