Lines Matching refs:i2c_dev
72 static inline void bcm2835_i2c_writel(struct bcm2835_i2c_dev *i2c_dev, in bcm2835_i2c_writel() argument
75 writel(val, i2c_dev->regs + reg); in bcm2835_i2c_writel()
78 static inline u32 bcm2835_i2c_readl(struct bcm2835_i2c_dev *i2c_dev, u32 reg) in bcm2835_i2c_readl() argument
80 return readl(i2c_dev->regs + reg); in bcm2835_i2c_readl()
83 static void bcm2835_fill_txfifo(struct bcm2835_i2c_dev *i2c_dev) in bcm2835_fill_txfifo() argument
87 while (i2c_dev->msg_buf_remaining) { in bcm2835_fill_txfifo()
88 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_fill_txfifo()
91 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_FIFO, in bcm2835_fill_txfifo()
92 *i2c_dev->msg_buf); in bcm2835_fill_txfifo()
93 i2c_dev->msg_buf++; in bcm2835_fill_txfifo()
94 i2c_dev->msg_buf_remaining--; in bcm2835_fill_txfifo()
98 static void bcm2835_drain_rxfifo(struct bcm2835_i2c_dev *i2c_dev) in bcm2835_drain_rxfifo() argument
102 while (i2c_dev->msg_buf_remaining) { in bcm2835_drain_rxfifo()
103 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_drain_rxfifo()
106 *i2c_dev->msg_buf = bcm2835_i2c_readl(i2c_dev, in bcm2835_drain_rxfifo()
108 i2c_dev->msg_buf++; in bcm2835_drain_rxfifo()
109 i2c_dev->msg_buf_remaining--; in bcm2835_drain_rxfifo()
115 struct bcm2835_i2c_dev *i2c_dev = data; in bcm2835_i2c_isr() local
118 val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S); in bcm2835_i2c_isr()
120 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_S, val); in bcm2835_i2c_isr()
124 i2c_dev->msg_err = err; in bcm2835_i2c_isr()
125 complete(&i2c_dev->completion); in bcm2835_i2c_isr()
130 bcm2835_drain_rxfifo(i2c_dev); in bcm2835_i2c_isr()
136 if (i2c_dev->msg_buf_remaining) in bcm2835_i2c_isr()
137 i2c_dev->msg_err = BCM2835_I2C_S_LEN; in bcm2835_i2c_isr()
139 i2c_dev->msg_err = 0; in bcm2835_i2c_isr()
140 complete(&i2c_dev->completion); in bcm2835_i2c_isr()
145 bcm2835_fill_txfifo(i2c_dev); in bcm2835_i2c_isr()
152 static int bcm2835_i2c_xfer_msg(struct bcm2835_i2c_dev *i2c_dev, in bcm2835_i2c_xfer_msg() argument
158 i2c_dev->msg_buf = msg->buf; in bcm2835_i2c_xfer_msg()
159 i2c_dev->msg_buf_remaining = msg->len; in bcm2835_i2c_xfer_msg()
160 reinit_completion(&i2c_dev->completion); in bcm2835_i2c_xfer_msg()
162 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, BCM2835_I2C_C_CLEAR); in bcm2835_i2c_xfer_msg()
168 bcm2835_fill_txfifo(i2c_dev); in bcm2835_i2c_xfer_msg()
172 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_A, msg->addr); in bcm2835_i2c_xfer_msg()
173 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DLEN, msg->len); in bcm2835_i2c_xfer_msg()
174 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, c); in bcm2835_i2c_xfer_msg()
176 time_left = wait_for_completion_timeout(&i2c_dev->completion, in bcm2835_i2c_xfer_msg()
178 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, BCM2835_I2C_C_CLEAR); in bcm2835_i2c_xfer_msg()
180 dev_err(i2c_dev->dev, "i2c transfer timed out\n"); in bcm2835_i2c_xfer_msg()
184 if (likely(!i2c_dev->msg_err)) in bcm2835_i2c_xfer_msg()
187 if ((i2c_dev->msg_err & BCM2835_I2C_S_ERR) && in bcm2835_i2c_xfer_msg()
191 dev_err(i2c_dev->dev, "i2c transfer failed: %x\n", i2c_dev->msg_err); in bcm2835_i2c_xfer_msg()
193 if (i2c_dev->msg_err & BCM2835_I2C_S_ERR) in bcm2835_i2c_xfer_msg()
202 struct bcm2835_i2c_dev *i2c_dev = i2c_get_adapdata(adap); in bcm2835_i2c_xfer() local
207 ret = bcm2835_i2c_xfer_msg(i2c_dev, &msgs[i]); in bcm2835_i2c_xfer()
227 struct bcm2835_i2c_dev *i2c_dev; in bcm2835_i2c_probe() local
233 i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL); in bcm2835_i2c_probe()
234 if (!i2c_dev) in bcm2835_i2c_probe()
236 platform_set_drvdata(pdev, i2c_dev); in bcm2835_i2c_probe()
237 i2c_dev->dev = &pdev->dev; in bcm2835_i2c_probe()
238 init_completion(&i2c_dev->completion); in bcm2835_i2c_probe()
241 i2c_dev->regs = devm_ioremap_resource(&pdev->dev, mem); in bcm2835_i2c_probe()
242 if (IS_ERR(i2c_dev->regs)) in bcm2835_i2c_probe()
243 return PTR_ERR(i2c_dev->regs); in bcm2835_i2c_probe()
245 i2c_dev->clk = devm_clk_get(&pdev->dev, NULL); in bcm2835_i2c_probe()
246 if (IS_ERR(i2c_dev->clk)) { in bcm2835_i2c_probe()
248 return PTR_ERR(i2c_dev->clk); in bcm2835_i2c_probe()
259 divider = DIV_ROUND_UP(clk_get_rate(i2c_dev->clk), bus_clk_rate); in bcm2835_i2c_probe()
272 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DIV, divider); in bcm2835_i2c_probe()
279 i2c_dev->irq = irq->start; in bcm2835_i2c_probe()
281 ret = request_irq(i2c_dev->irq, bcm2835_i2c_isr, IRQF_SHARED, in bcm2835_i2c_probe()
282 dev_name(&pdev->dev), i2c_dev); in bcm2835_i2c_probe()
288 adap = &i2c_dev->adapter; in bcm2835_i2c_probe()
289 i2c_set_adapdata(adap, i2c_dev); in bcm2835_i2c_probe()
297 bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, 0); in bcm2835_i2c_probe()
301 free_irq(i2c_dev->irq, i2c_dev); in bcm2835_i2c_probe()
308 struct bcm2835_i2c_dev *i2c_dev = platform_get_drvdata(pdev); in bcm2835_i2c_remove() local
310 free_irq(i2c_dev->irq, i2c_dev); in bcm2835_i2c_remove()
311 i2c_del_adapter(&i2c_dev->adapter); in bcm2835_i2c_remove()