Lines Matching defs:siic
87 static void i2c_sirfsoc_read_data(struct sirfsoc_i2c *siic)
92 for (i = 0; i < siic->read_cmd_len; i++) {
94 data = readl(siic->base + SIRFSOC_I2C_DATA_BUF + i);
95 siic->buf[siic->finished_len++] =
101 static void i2c_sirfsoc_queue_cmd(struct sirfsoc_i2c *siic)
106 if (siic->msg_read) {
107 while (((siic->finished_len + i) < siic->msg_len)
108 && (siic->cmd_ptr < SIRFSOC_I2C_CMD_BUF_MAX)) {
110 if (((siic->finished_len + i) ==
111 (siic->msg_len - 1)) && siic->last)
114 siic->base + SIRFSOC_I2C_CMD(siic->cmd_ptr++));
118 siic->read_cmd_len = i;
120 while ((siic->cmd_ptr < SIRFSOC_I2C_CMD_BUF_MAX - 1)
121 && (siic->finished_len < siic->msg_len)) {
123 if ((siic->finished_len == (siic->msg_len - 1))
124 && siic->last)
127 siic->base + SIRFSOC_I2C_CMD(siic->cmd_ptr++));
128 writel(siic->buf[siic->finished_len++],
129 siic->base + SIRFSOC_I2C_CMD(siic->cmd_ptr++));
132 siic->cmd_ptr = 0;
135 writel(SIRFSOC_I2C_START_CMD, siic->base + SIRFSOC_I2C_CMD_START);
140 struct sirfsoc_i2c *siic = (struct sirfsoc_i2c *)dev_id;
141 u32 i2c_stat = readl(siic->base + SIRFSOC_I2C_STATUS);
145 siic->err_status = SIRFSOC_I2C_ERR_NOACK;
146 writel(SIRFSOC_I2C_STAT_ERR, siic->base + SIRFSOC_I2C_STATUS);
149 dev_dbg(&siic->adapter.dev, "ACK not received\n");
151 dev_err(&siic->adapter.dev, "I2C error\n");
158 writel(readl(siic->base + SIRFSOC_I2C_CTRL) | SIRFSOC_I2C_RESET,
159 siic->base + SIRFSOC_I2C_CTRL);
160 while (readl(siic->base + SIRFSOC_I2C_CTRL) & SIRFSOC_I2C_RESET)
163 complete(&siic->done);
166 if (siic->msg_read)
167 i2c_sirfsoc_read_data(siic);
168 if (siic->finished_len == siic->msg_len)
169 complete(&siic->done);
171 i2c_sirfsoc_queue_cmd(siic);
173 writel(SIRFSOC_I2C_STAT_CMD_DONE, siic->base + SIRFSOC_I2C_STATUS);
179 static void i2c_sirfsoc_set_address(struct sirfsoc_i2c *siic,
186 if (siic->last && (msg->len == 0))
189 writel(regval, siic->base + SIRFSOC_I2C_CMD(siic->cmd_ptr++));
197 writel(addr, siic->base + SIRFSOC_I2C_CMD(siic->cmd_ptr++));
200 static int i2c_sirfsoc_xfer_msg(struct sirfsoc_i2c *siic, struct i2c_msg *msg)
202 u32 regval = readl(siic->base + SIRFSOC_I2C_CTRL);
206 i2c_sirfsoc_set_address(siic, msg);
209 siic->base + SIRFSOC_I2C_CTRL);
210 i2c_sirfsoc_queue_cmd(siic);
212 if (wait_for_completion_timeout(&siic->done, timeout) == 0) {
213 siic->err_status = SIRFSOC_I2C_ERR_TIMEOUT;
214 dev_err(&siic->adapter.dev, "Transfer timeout\n");
218 siic->base + SIRFSOC_I2C_CTRL);
219 writel(0, siic->base + SIRFSOC_I2C_CMD_START);
222 if (siic->err_status == SIRFSOC_I2C_ERR_TIMEOUT) {
223 writel(readl(siic->base + SIRFSOC_I2C_CTRL) | SIRFSOC_I2C_RESET,
224 siic->base + SIRFSOC_I2C_CTRL);
225 while (readl(siic->base + SIRFSOC_I2C_CTRL) & SIRFSOC_I2C_RESET)
228 return siic->err_status ? -EAGAIN : 0;
239 struct sirfsoc_i2c *siic = adap->algo_data;
242 clk_enable(siic->clk);
245 siic->buf = msgs[i].buf;
246 siic->msg_len = msgs[i].len;
247 siic->msg_read = !!(msgs[i].flags & I2C_M_RD);
248 siic->err_status = 0;
249 siic->cmd_ptr = 0;
250 siic->finished_len = 0;
251 siic->last = (i == (num - 1));
253 ret = i2c_sirfsoc_xfer_msg(siic, &msgs[i]);
255 clk_disable(siic->clk);
260 clk_disable(siic->clk);
272 struct sirfsoc_i2c *siic;
303 siic = devm_kzalloc(&pdev->dev, sizeof(*siic), GFP_KERNEL);
304 if (!siic) {
308 adap = &siic->adapter;
311 siic->base = devm_platform_ioremap_resource(pdev, 0);
312 if (IS_ERR(siic->base)) {
313 err = PTR_ERR(siic->base);
323 dev_name(&pdev->dev), siic);
328 adap->algo_data = siic;
338 init_completion(&siic->done);
342 writel(SIRFSOC_I2C_RESET, siic->base + SIRFSOC_I2C_CTRL);
343 while (readl(siic->base + SIRFSOC_I2C_CTRL) & SIRFSOC_I2C_RESET)
346 siic->base + SIRFSOC_I2C_CTRL);
348 siic->clk = clk;
379 writel(regval, siic->base + SIRFSOC_I2C_CLK_CTRL);
381 writel(0xFF, siic->base + SIRFSOC_I2C_SDA_DELAY);
383 writel(regval, siic->base + SIRFSOC_I2C_SDA_DELAY);
408 struct sirfsoc_i2c *siic = adapter->algo_data;
410 writel(SIRFSOC_I2C_RESET, siic->base + SIRFSOC_I2C_CTRL);
412 clk_unprepare(siic->clk);
413 clk_put(siic->clk);
421 struct sirfsoc_i2c *siic = adapter->algo_data;
423 clk_enable(siic->clk);
424 siic->sda_delay = readl(siic->base + SIRFSOC_I2C_SDA_DELAY);
425 siic->clk_div = readl(siic->base + SIRFSOC_I2C_CLK_CTRL);
426 clk_disable(siic->clk);
433 struct sirfsoc_i2c *siic = adapter->algo_data;
435 clk_enable(siic->clk);
436 writel(SIRFSOC_I2C_RESET, siic->base + SIRFSOC_I2C_CTRL);
437 while (readl(siic->base + SIRFSOC_I2C_CTRL) & SIRFSOC_I2C_RESET)
440 siic->base + SIRFSOC_I2C_CTRL);
441 writel(siic->clk_div, siic->base + SIRFSOC_I2C_CLK_CTRL);
442 writel(siic->sda_delay, siic->base + SIRFSOC_I2C_SDA_DELAY);
443 clk_disable(siic->clk);