Lines Matching refs:ddata
128 static u32 efm32_i2c_read32(struct efm32_i2c_ddata *ddata, unsigned offset)
130 return readl(ddata->base + offset);
133 static void efm32_i2c_write32(struct efm32_i2c_ddata *ddata,
136 writel(value, ddata->base + offset);
139 static void efm32_i2c_send_next_msg(struct efm32_i2c_ddata *ddata)
141 struct i2c_msg *cur_msg = &ddata->msgs[ddata->current_msg];
143 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_START);
144 efm32_i2c_write32(ddata, REG_TXDATA, i2c_8bit_addr_from_msg(cur_msg));
147 static void efm32_i2c_send_next_byte(struct efm32_i2c_ddata *ddata)
149 struct i2c_msg *cur_msg = &ddata->msgs[ddata->current_msg];
151 if (ddata->current_word >= cur_msg->len) {
153 ddata->current_word = 0;
154 ddata->current_msg += 1;
156 if (ddata->current_msg >= ddata->num_msgs) {
157 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_STOP);
158 complete(&ddata->done);
160 efm32_i2c_send_next_msg(ddata);
163 efm32_i2c_write32(ddata, REG_TXDATA,
164 cur_msg->buf[ddata->current_word++]);
168 static void efm32_i2c_recv_next_byte(struct efm32_i2c_ddata *ddata)
170 struct i2c_msg *cur_msg = &ddata->msgs[ddata->current_msg];
172 cur_msg->buf[ddata->current_word] = efm32_i2c_read32(ddata, REG_RXDATA);
173 ddata->current_word += 1;
174 if (ddata->current_word >= cur_msg->len) {
176 ddata->current_word = 0;
177 ddata->current_msg += 1;
179 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_NACK);
181 if (ddata->current_msg >= ddata->num_msgs) {
182 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_STOP);
183 complete(&ddata->done);
185 efm32_i2c_send_next_msg(ddata);
188 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_ACK);
194 struct efm32_i2c_ddata *ddata = dev_id;
195 struct i2c_msg *cur_msg = &ddata->msgs[ddata->current_msg];
196 u32 irqflag = efm32_i2c_read32(ddata, REG_IF);
197 u32 state = efm32_i2c_read32(ddata, REG_STATE);
199 efm32_i2c_write32(ddata, REG_IFC, irqflag & REG_IFC__MASK);
204 ddata->retval = -EAGAIN;
205 complete(&ddata->done);
212 ddata->retval = -EIO;
213 efm32_i2c_write32(ddata, REG_CMD,
216 complete(&ddata->done);
226 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_STOP);
227 ddata->retval = -ENXIO;
228 complete(&ddata->done);
232 efm32_i2c_send_next_byte(ddata);
237 efm32_i2c_recv_next_byte(ddata);
244 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_STOP);
245 complete(&ddata->done);
247 efm32_i2c_send_next_byte(ddata);
257 struct efm32_i2c_ddata *ddata = i2c_get_adapdata(adap);
260 if (ddata->msgs)
263 ddata->msgs = msgs;
264 ddata->num_msgs = num;
265 ddata->current_word = 0;
266 ddata->current_msg = 0;
267 ddata->retval = -EIO;
269 reinit_completion(&ddata->done);
271 dev_dbg(&ddata->adapter.dev, "state: %08x, status: %08x\n",
272 efm32_i2c_read32(ddata, REG_STATE),
273 efm32_i2c_read32(ddata, REG_STATUS));
275 efm32_i2c_send_next_msg(ddata);
277 wait_for_completion(&ddata->done);
279 if (ddata->current_msg >= ddata->num_msgs)
280 ret = ddata->num_msgs;
282 ret = ddata->retval;
297 static u32 efm32_i2c_get_configured_location(struct efm32_i2c_ddata *ddata)
299 u32 reg = efm32_i2c_read32(ddata, REG_ROUTE);
307 struct efm32_i2c_ddata *ddata;
315 ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL);
316 if (!ddata)
318 platform_set_drvdata(pdev, ddata);
320 init_completion(&ddata->done);
321 strlcpy(ddata->adapter.name, pdev->name, sizeof(ddata->adapter.name));
322 ddata->adapter.owner = THIS_MODULE;
323 ddata->adapter.algo = &efm32_i2c_algo;
324 ddata->adapter.dev.parent = &pdev->dev;
325 ddata->adapter.dev.of_node = pdev->dev.of_node;
326 i2c_set_adapdata(&ddata->adapter, ddata);
328 ddata->clk = devm_clk_get(&pdev->dev, NULL);
329 if (IS_ERR(ddata->clk)) {
330 ret = PTR_ERR(ddata->clk);
335 ddata->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
336 if (IS_ERR(ddata->base))
337 return PTR_ERR(ddata->base);
351 ddata->irq = ret;
353 ret = clk_prepare_enable(ddata->clk);
370 location = efm32_i2c_get_configured_location(ddata);
375 ddata->location = location;
384 ddata->frequency = frequency;
386 rate = clk_get_rate(ddata->clk);
392 clkdiv = DIV_ROUND_UP(rate, 8 * ddata->frequency) - 1;
396 rate, ddata->frequency);
402 rate, ddata->frequency, (unsigned long)clkdiv);
403 efm32_i2c_write32(ddata, REG_CLKDIV, REG_CLKDIV_DIV(clkdiv));
405 efm32_i2c_write32(ddata, REG_ROUTE, REG_ROUTE_SDAPEN |
407 REG_ROUTE_LOCATION(ddata->location));
409 efm32_i2c_write32(ddata, REG_CTRL, REG_CTRL_EN |
412 efm32_i2c_write32(ddata, REG_IFC, REG_IFC__MASK);
413 efm32_i2c_write32(ddata, REG_IEN, REG_IF_TXC | REG_IF_ACK | REG_IF_NACK
417 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_ABORT);
419 ret = request_irq(ddata->irq, efm32_i2c_irq, 0, DRIVER_NAME, ddata);
425 ret = i2c_add_adapter(&ddata->adapter);
427 free_irq(ddata->irq, ddata);
430 clk_disable_unprepare(ddata->clk);
437 struct efm32_i2c_ddata *ddata = platform_get_drvdata(pdev);
439 i2c_del_adapter(&ddata->adapter);
440 free_irq(ddata->irq, ddata);
441 clk_disable_unprepare(ddata->clk);