Lines Matching refs:ddata
131 static u32 efm32_i2c_read32(struct efm32_i2c_ddata *ddata, unsigned offset) in efm32_i2c_read32() argument
133 return readl(ddata->base + offset); in efm32_i2c_read32()
136 static void efm32_i2c_write32(struct efm32_i2c_ddata *ddata, in efm32_i2c_write32() argument
139 writel(value, ddata->base + offset); in efm32_i2c_write32()
142 static void efm32_i2c_send_next_msg(struct efm32_i2c_ddata *ddata) in efm32_i2c_send_next_msg() argument
144 struct i2c_msg *cur_msg = &ddata->msgs[ddata->current_msg]; in efm32_i2c_send_next_msg()
146 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_START); in efm32_i2c_send_next_msg()
147 efm32_i2c_write32(ddata, REG_TXDATA, cur_msg->addr << 1 | in efm32_i2c_send_next_msg()
151 static void efm32_i2c_send_next_byte(struct efm32_i2c_ddata *ddata) in efm32_i2c_send_next_byte() argument
153 struct i2c_msg *cur_msg = &ddata->msgs[ddata->current_msg]; in efm32_i2c_send_next_byte()
155 if (ddata->current_word >= cur_msg->len) { in efm32_i2c_send_next_byte()
157 ddata->current_word = 0; in efm32_i2c_send_next_byte()
158 ddata->current_msg += 1; in efm32_i2c_send_next_byte()
160 if (ddata->current_msg >= ddata->num_msgs) { in efm32_i2c_send_next_byte()
161 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_STOP); in efm32_i2c_send_next_byte()
162 complete(&ddata->done); in efm32_i2c_send_next_byte()
164 efm32_i2c_send_next_msg(ddata); in efm32_i2c_send_next_byte()
167 efm32_i2c_write32(ddata, REG_TXDATA, in efm32_i2c_send_next_byte()
168 cur_msg->buf[ddata->current_word++]); in efm32_i2c_send_next_byte()
172 static void efm32_i2c_recv_next_byte(struct efm32_i2c_ddata *ddata) in efm32_i2c_recv_next_byte() argument
174 struct i2c_msg *cur_msg = &ddata->msgs[ddata->current_msg]; in efm32_i2c_recv_next_byte()
176 cur_msg->buf[ddata->current_word] = efm32_i2c_read32(ddata, REG_RXDATA); in efm32_i2c_recv_next_byte()
177 ddata->current_word += 1; in efm32_i2c_recv_next_byte()
178 if (ddata->current_word >= cur_msg->len) { in efm32_i2c_recv_next_byte()
180 ddata->current_word = 0; in efm32_i2c_recv_next_byte()
181 ddata->current_msg += 1; in efm32_i2c_recv_next_byte()
183 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_NACK); in efm32_i2c_recv_next_byte()
185 if (ddata->current_msg >= ddata->num_msgs) { in efm32_i2c_recv_next_byte()
186 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_STOP); in efm32_i2c_recv_next_byte()
187 complete(&ddata->done); in efm32_i2c_recv_next_byte()
189 efm32_i2c_send_next_msg(ddata); in efm32_i2c_recv_next_byte()
192 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_ACK); in efm32_i2c_recv_next_byte()
198 struct efm32_i2c_ddata *ddata = dev_id; in efm32_i2c_irq() local
199 struct i2c_msg *cur_msg = &ddata->msgs[ddata->current_msg]; in efm32_i2c_irq()
200 u32 irqflag = efm32_i2c_read32(ddata, REG_IF); in efm32_i2c_irq()
201 u32 state = efm32_i2c_read32(ddata, REG_STATE); in efm32_i2c_irq()
203 efm32_i2c_write32(ddata, REG_IFC, irqflag & REG_IFC__MASK); in efm32_i2c_irq()
208 ddata->retval = -EAGAIN; in efm32_i2c_irq()
209 complete(&ddata->done); in efm32_i2c_irq()
216 ddata->retval = -EIO; in efm32_i2c_irq()
217 efm32_i2c_write32(ddata, REG_CMD, in efm32_i2c_irq()
220 complete(&ddata->done); in efm32_i2c_irq()
230 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_STOP); in efm32_i2c_irq()
231 ddata->retval = -ENXIO; in efm32_i2c_irq()
232 complete(&ddata->done); in efm32_i2c_irq()
236 efm32_i2c_send_next_byte(ddata); in efm32_i2c_irq()
241 efm32_i2c_recv_next_byte(ddata); in efm32_i2c_irq()
248 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_STOP); in efm32_i2c_irq()
249 complete(&ddata->done); in efm32_i2c_irq()
251 efm32_i2c_send_next_byte(ddata); in efm32_i2c_irq()
261 struct efm32_i2c_ddata *ddata = i2c_get_adapdata(adap); in efm32_i2c_master_xfer() local
264 if (ddata->msgs) in efm32_i2c_master_xfer()
267 ddata->msgs = msgs; in efm32_i2c_master_xfer()
268 ddata->num_msgs = num; in efm32_i2c_master_xfer()
269 ddata->current_word = 0; in efm32_i2c_master_xfer()
270 ddata->current_msg = 0; in efm32_i2c_master_xfer()
271 ddata->retval = -EIO; in efm32_i2c_master_xfer()
273 reinit_completion(&ddata->done); in efm32_i2c_master_xfer()
275 dev_dbg(&ddata->adapter.dev, "state: %08x, status: %08x\n", in efm32_i2c_master_xfer()
276 efm32_i2c_read32(ddata, REG_STATE), in efm32_i2c_master_xfer()
277 efm32_i2c_read32(ddata, REG_STATUS)); in efm32_i2c_master_xfer()
279 efm32_i2c_send_next_msg(ddata); in efm32_i2c_master_xfer()
281 wait_for_completion(&ddata->done); in efm32_i2c_master_xfer()
283 if (ddata->current_msg >= ddata->num_msgs) in efm32_i2c_master_xfer()
284 ret = ddata->num_msgs; in efm32_i2c_master_xfer()
286 ret = ddata->retval; in efm32_i2c_master_xfer()
301 static u32 efm32_i2c_get_configured_location(struct efm32_i2c_ddata *ddata) in efm32_i2c_get_configured_location() argument
303 u32 reg = efm32_i2c_read32(ddata, REG_ROUTE); in efm32_i2c_get_configured_location()
311 struct efm32_i2c_ddata *ddata; in efm32_i2c_probe() local
322 ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL); in efm32_i2c_probe()
323 if (!ddata) in efm32_i2c_probe()
325 platform_set_drvdata(pdev, ddata); in efm32_i2c_probe()
327 init_completion(&ddata->done); in efm32_i2c_probe()
328 strlcpy(ddata->adapter.name, pdev->name, sizeof(ddata->adapter.name)); in efm32_i2c_probe()
329 ddata->adapter.owner = THIS_MODULE; in efm32_i2c_probe()
330 ddata->adapter.algo = &efm32_i2c_algo; in efm32_i2c_probe()
331 ddata->adapter.dev.parent = &pdev->dev; in efm32_i2c_probe()
332 ddata->adapter.dev.of_node = pdev->dev.of_node; in efm32_i2c_probe()
333 i2c_set_adapdata(&ddata->adapter, ddata); in efm32_i2c_probe()
335 ddata->clk = devm_clk_get(&pdev->dev, NULL); in efm32_i2c_probe()
336 if (IS_ERR(ddata->clk)) { in efm32_i2c_probe()
337 ret = PTR_ERR(ddata->clk); in efm32_i2c_probe()
353 ddata->base = devm_ioremap_resource(&pdev->dev, res); in efm32_i2c_probe()
354 if (IS_ERR(ddata->base)) in efm32_i2c_probe()
355 return PTR_ERR(ddata->base); in efm32_i2c_probe()
365 ddata->irq = ret; in efm32_i2c_probe()
367 ret = clk_prepare_enable(ddata->clk); in efm32_i2c_probe()
384 location = efm32_i2c_get_configured_location(ddata); in efm32_i2c_probe()
389 ddata->location = location; in efm32_i2c_probe()
398 ddata->frequency = frequency; in efm32_i2c_probe()
400 rate = clk_get_rate(ddata->clk); in efm32_i2c_probe()
406 clkdiv = DIV_ROUND_UP(rate, 8 * ddata->frequency) - 1; in efm32_i2c_probe()
410 rate, ddata->frequency); in efm32_i2c_probe()
416 rate, ddata->frequency, (unsigned long)clkdiv); in efm32_i2c_probe()
417 efm32_i2c_write32(ddata, REG_CLKDIV, REG_CLKDIV_DIV(clkdiv)); in efm32_i2c_probe()
419 efm32_i2c_write32(ddata, REG_ROUTE, REG_ROUTE_SDAPEN | in efm32_i2c_probe()
421 REG_ROUTE_LOCATION(ddata->location)); in efm32_i2c_probe()
423 efm32_i2c_write32(ddata, REG_CTRL, REG_CTRL_EN | in efm32_i2c_probe()
426 efm32_i2c_write32(ddata, REG_IFC, REG_IFC__MASK); in efm32_i2c_probe()
427 efm32_i2c_write32(ddata, REG_IEN, REG_IF_TXC | REG_IF_ACK | REG_IF_NACK in efm32_i2c_probe()
431 efm32_i2c_write32(ddata, REG_CMD, REG_CMD_ABORT); in efm32_i2c_probe()
433 ret = request_irq(ddata->irq, efm32_i2c_irq, 0, DRIVER_NAME, ddata); in efm32_i2c_probe()
439 ret = i2c_add_adapter(&ddata->adapter); in efm32_i2c_probe()
442 free_irq(ddata->irq, ddata); in efm32_i2c_probe()
445 clk_disable_unprepare(ddata->clk); in efm32_i2c_probe()
452 struct efm32_i2c_ddata *ddata = platform_get_drvdata(pdev); in efm32_i2c_remove() local
454 i2c_del_adapter(&ddata->adapter); in efm32_i2c_remove()
455 free_irq(ddata->irq, ddata); in efm32_i2c_remove()
456 clk_disable_unprepare(ddata->clk); in efm32_i2c_remove()