Lines Matching refs:idev

119 static void mchp_corei2c_core_disable(struct mchp_corei2c_dev *idev)
121 u8 ctrl = readb(idev->base + CORE_I2C_CTRL);
124 writeb(ctrl, idev->base + CORE_I2C_CTRL);
127 static void mchp_corei2c_core_enable(struct mchp_corei2c_dev *idev)
129 u8 ctrl = readb(idev->base + CORE_I2C_CTRL);
132 writeb(ctrl, idev->base + CORE_I2C_CTRL);
135 static void mchp_corei2c_reset(struct mchp_corei2c_dev *idev)
137 mchp_corei2c_core_disable(idev);
138 mchp_corei2c_core_enable(idev);
141 static inline void mchp_corei2c_stop(struct mchp_corei2c_dev *idev)
143 u8 ctrl = readb(idev->base + CORE_I2C_CTRL);
146 writeb(ctrl, idev->base + CORE_I2C_CTRL);
150 struct mchp_corei2c_dev *idev)
173 ctrl = readb(idev->base + CORE_I2C_CTRL);
176 writeb(ctrl, idev->base + CORE_I2C_CTRL);
178 ctrl = readb(idev->base + CORE_I2C_CTRL);
185 static int mchp_corei2c_init(struct mchp_corei2c_dev *idev)
187 u32 clk_rate = clk_get_rate(idev->i2c_clk);
188 u32 divisor = clk_rate / idev->bus_clk_rate;
191 ret = mchp_corei2c_set_divisor(divisor, idev);
195 mchp_corei2c_reset(idev);
200 static void mchp_corei2c_empty_rx(struct mchp_corei2c_dev *idev)
204 if (idev->msg_len > 0) {
205 *idev->buf++ = readb(idev->base + CORE_I2C_DATA);
206 idev->msg_len--;
209 if (idev->msg_len <= 1) {
210 ctrl = readb(idev->base + CORE_I2C_CTRL);
212 writeb(ctrl, idev->base + CORE_I2C_CTRL);
216 static int mchp_corei2c_fill_tx(struct mchp_corei2c_dev *idev)
218 if (idev->msg_len > 0)
219 writeb(*idev->buf++, idev->base + CORE_I2C_DATA);
220 idev->msg_len--;
225 static irqreturn_t mchp_corei2c_handle_isr(struct mchp_corei2c_dev *idev)
227 u32 status = idev->isr_status;
231 if (!idev->buf)
237 ctrl = readb(idev->base + CORE_I2C_CTRL);
239 writeb(idev->addr, idev->base + CORE_I2C_DATA);
240 writeb(ctrl, idev->base + CORE_I2C_CTRL);
241 if (idev->msg_len == 0)
245 idev->msg_err = -EAGAIN;
250 if (idev->msg_len > 0)
251 mchp_corei2c_fill_tx(idev);
258 idev->msg_err = -ENXIO;
262 ctrl = readb(idev->base + CORE_I2C_CTRL);
263 if (idev->msg_len == 1u) {
265 writeb(ctrl, idev->base + CORE_I2C_CTRL);
268 writeb(ctrl, idev->base + CORE_I2C_CTRL);
270 if (idev->msg_len < 1u)
274 mchp_corei2c_empty_rx(idev);
277 mchp_corei2c_empty_rx(idev);
278 if (idev->msg_len == 0)
287 mchp_corei2c_stop(idev);
290 complete(&idev->msg_complete);
297 struct mchp_corei2c_dev *idev = _dev;
301 ctrl = readb(idev->base + CORE_I2C_CTRL);
303 idev->isr_status = readb(idev->base + CORE_I2C_STATUS);
304 ret = mchp_corei2c_handle_isr(idev);
307 ctrl = readb(idev->base + CORE_I2C_CTRL);
309 writeb(ctrl, idev->base + CORE_I2C_CTRL);
314 static int mchp_corei2c_xfer_msg(struct mchp_corei2c_dev *idev,
320 idev->addr = i2c_8bit_addr_from_msg(msg);
321 idev->msg_len = msg->len;
322 idev->buf = msg->buf;
323 idev->msg_err = 0;
325 reinit_completion(&idev->msg_complete);
327 mchp_corei2c_core_enable(idev);
329 ctrl = readb(idev->base + CORE_I2C_CTRL);
331 writeb(ctrl, idev->base + CORE_I2C_CTRL);
333 time_left = wait_for_completion_timeout(&idev->msg_complete,
334 idev->adapter.timeout);
338 return idev->msg_err;
344 struct mchp_corei2c_dev *idev = i2c_get_adapdata(adap);
348 ret = mchp_corei2c_xfer_msg(idev, msgs++);
368 struct mchp_corei2c_dev *idev;
372 idev = devm_kzalloc(&pdev->dev, sizeof(*idev), GFP_KERNEL);
373 if (!idev)
376 idev->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
377 if (IS_ERR(idev->base))
378 return PTR_ERR(idev->base);
384 idev->i2c_clk = devm_clk_get(&pdev->dev, NULL);
385 if (IS_ERR(idev->i2c_clk))
386 return dev_err_probe(&pdev->dev, PTR_ERR(idev->i2c_clk),
389 idev->dev = &pdev->dev;
390 init_completion(&idev->msg_complete);
392 ret = device_property_read_u32(idev->dev, "clock-frequency",
393 &idev->bus_clk_rate);
394 if (ret || !idev->bus_clk_rate) {
396 idev->bus_clk_rate = 100000;
399 if (idev->bus_clk_rate > 400000)
402 idev->bus_clk_rate);
410 pdev->name, idev);
415 ret = clk_prepare_enable(idev->i2c_clk);
420 ret = mchp_corei2c_init(idev);
422 clk_disable_unprepare(idev->i2c_clk);
426 i2c_set_adapdata(&idev->adapter, idev);
427 snprintf(idev->adapter.name, sizeof(idev->adapter.name),
429 idev->adapter.owner = THIS_MODULE;
430 idev->adapter.algo = &mchp_corei2c_algo;
431 idev->adapter.dev.parent = &pdev->dev;
432 idev->adapter.dev.of_node = pdev->dev.of_node;
433 idev->adapter.timeout = HZ;
435 platform_set_drvdata(pdev, idev);
437 ret = i2c_add_adapter(&idev->adapter);
439 clk_disable_unprepare(idev->i2c_clk);
450 struct mchp_corei2c_dev *idev = platform_get_drvdata(pdev);
452 clk_disable_unprepare(idev->i2c_clk);
453 i2c_del_adapter(&idev->adapter);