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>
8 #include <linux/mfd/rk616.h>
10 #include <mach/iomux.h>
11 #include <linux/err.h>
14 static struct mfd_cell rk616_devs[] = {
20 .name = "rk616-codec",
33 static int rk616_i2c_read_reg(struct mfd_rk616 *rk616, u16 reg,u32 *pval)
35 struct i2c_client * client = rk616->client;
36 struct i2c_adapter *adap = client->adapter;
37 struct i2c_msg msgs[2];
41 memcpy(reg_buf, ®, 2);
43 msgs[0].addr = client->addr;
44 msgs[0].flags = client->flags;
46 msgs[0].buf = reg_buf;
47 msgs[0].scl_rate = rk616->pdata->scl_rate;
48 msgs[0].udelay = client->udelay;
50 msgs[1].addr = client->addr;
51 msgs[1].flags = client->flags | I2C_M_RD;
53 msgs[1].buf = (char *)pval;
54 msgs[1].scl_rate = rk616->pdata->scl_rate;
55 msgs[1].udelay = client->udelay;
57 ret = i2c_transfer(adap, msgs, 2);
60 return (ret == 2)? 4 : ret;
64 static int rk616_i2c_write_reg(struct mfd_rk616 *rk616, u16 reg,u32 *pval)
66 struct i2c_client *client = rk616->client;
67 struct i2c_adapter *adap = client->adapter;
70 char *tx_buf = (char *)kmalloc(6, GFP_KERNEL);
74 memcpy(tx_buf, ®, 2);
75 memcpy(tx_buf+2, (char *)pval, 4);
77 msg.addr = client->addr;
78 msg.flags = client->flags;
80 msg.buf = (char *)tx_buf;
81 msg.scl_rate = rk616->pdata->scl_rate;
82 msg.udelay = client->udelay;
84 ret = i2c_transfer(adap, &msg, 1);
88 return (ret == 1) ? 4 : ret;
92 static int rk616_clk_route_init(struct mfd_rk616 *rk616)
97 static int rk616_i2c_probe(struct i2c_client *client,const struct i2c_device_id *id)
100 struct mfd_rk616 *rk616 = NULL;
103 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
105 dev_err(&client->dev, "Must have I2C_FUNC_I2C.\n");
108 rk616 = kzalloc(sizeof(struct mfd_rk616), GFP_KERNEL);
111 printk(KERN_ALERT "alloc for struct rk616 fail\n");
115 rk616->dev = &client->dev;
116 rk616->pdata = client->dev.platform_data;
117 rk616->client = client;
118 i2c_set_clientdata(client, rk616);
119 dev_set_drvdata(rk616->dev,rk616);
121 if(rk616->pdata->power_init)
122 rk616->pdata->power_init();
124 #if defined(CONFIG_SND_RK29_SOC_I2S_8CH)
125 iis_clk = clk_get_sys("rk29_i2s.0", "i2s");
126 #elif defined(CONFIG_SND_RK29_SOC_I2S_2CH)
127 iis_clk = clk_get_sys("rk29_i2s.1", "i2s");
129 iis_clk = clk_get_sys("rk29_i2s.2", "i2s");
133 dev_err(&client->dev,"failed to get i2s clk\n");
134 ret = PTR_ERR(iis_clk);
138 #if defined(CONFIG_ARCH_RK29)
139 rk29_mux_api_set(GPIO2D0_I2S0CLK_MIIRXCLKIN_NAME, GPIO2H_I2S0_CLK);
144 clk_set_rate(iis_clk, 11289600);
147 rk616->read_dev = rk616_i2c_read_reg;
148 rk616->write_dev = rk616_i2c_write_reg;
149 ret = mfd_add_devices(rk616->dev, -1,
150 rk616_devs, ARRAY_SIZE(rk616_devs),
151 NULL, rk616->irq_base);
153 dev_info(&client->dev,"rk616 core probe success!\n");
157 static int __devexit rk616_i2c_remove(struct i2c_client *client)
162 static const struct i2c_device_id id_table[] = {
167 static struct i2c_driver rk616_i2c_driver = {
170 .owner = THIS_MODULE,
172 .probe = &rk616_i2c_probe,
173 .remove = &rk616_i2c_remove,
174 .id_table = id_table,
178 static int __init rk616_module_init(void)
180 return i2c_add_driver(&rk616_i2c_driver);
183 static void __exit rk616_module_exit(void)
185 i2c_del_driver(&rk616_i2c_driver);
188 subsys_initcall_sync(rk616_module_init);
189 module_exit(rk616_module_exit);