Lines Matching refs:dev
20 static void i2c_dw_configure_fifo_slave(struct dw_i2c_dev *dev) in i2c_dw_configure_fifo_slave() argument
23 dw_writel(dev, 0, DW_IC_TX_TL); in i2c_dw_configure_fifo_slave()
24 dw_writel(dev, 0, DW_IC_RX_TL); in i2c_dw_configure_fifo_slave()
27 dw_writel(dev, dev->slave_cfg, DW_IC_CON); in i2c_dw_configure_fifo_slave()
28 dw_writel(dev, DW_IC_INTR_SLAVE_MASK, DW_IC_INTR_MASK); in i2c_dw_configure_fifo_slave()
39 static int i2c_dw_init_slave(struct dw_i2c_dev *dev) in i2c_dw_init_slave() argument
43 ret = i2c_dw_acquire_lock(dev); in i2c_dw_init_slave()
48 __i2c_dw_disable(dev); in i2c_dw_init_slave()
51 if (dev->sda_hold_time) in i2c_dw_init_slave()
52 dw_writel(dev, dev->sda_hold_time, DW_IC_SDA_HOLD); in i2c_dw_init_slave()
54 i2c_dw_configure_fifo_slave(dev); in i2c_dw_init_slave()
55 i2c_dw_release_lock(dev); in i2c_dw_init_slave()
62 struct dw_i2c_dev *dev = i2c_get_adapdata(slave->adapter); in i2c_dw_reg_slave() local
64 if (dev->slave) in i2c_dw_reg_slave()
68 pm_runtime_get_sync(dev->dev); in i2c_dw_reg_slave()
74 __i2c_dw_disable_nowait(dev); in i2c_dw_reg_slave()
75 dw_writel(dev, slave->addr, DW_IC_SAR); in i2c_dw_reg_slave()
76 dev->slave = slave; in i2c_dw_reg_slave()
78 __i2c_dw_enable(dev); in i2c_dw_reg_slave()
80 dev->cmd_err = 0; in i2c_dw_reg_slave()
81 dev->msg_write_idx = 0; in i2c_dw_reg_slave()
82 dev->msg_read_idx = 0; in i2c_dw_reg_slave()
83 dev->msg_err = 0; in i2c_dw_reg_slave()
84 dev->status = STATUS_IDLE; in i2c_dw_reg_slave()
85 dev->abort_source = 0; in i2c_dw_reg_slave()
86 dev->rx_outstanding = 0; in i2c_dw_reg_slave()
93 struct dw_i2c_dev *dev = i2c_get_adapdata(slave->adapter); in i2c_dw_unreg_slave() local
95 dev->disable_int(dev); in i2c_dw_unreg_slave()
96 dev->disable(dev); in i2c_dw_unreg_slave()
97 dev->slave = NULL; in i2c_dw_unreg_slave()
98 pm_runtime_put(dev->dev); in i2c_dw_unreg_slave()
103 static u32 i2c_dw_read_clear_intrbits_slave(struct dw_i2c_dev *dev) in i2c_dw_read_clear_intrbits_slave() argument
119 stat = dw_readl(dev, DW_IC_INTR_STAT); in i2c_dw_read_clear_intrbits_slave()
129 dw_readl(dev, DW_IC_CLR_TX_ABRT); in i2c_dw_read_clear_intrbits_slave()
131 dw_readl(dev, DW_IC_CLR_RX_UNDER); in i2c_dw_read_clear_intrbits_slave()
133 dw_readl(dev, DW_IC_CLR_RX_OVER); in i2c_dw_read_clear_intrbits_slave()
135 dw_readl(dev, DW_IC_CLR_TX_OVER); in i2c_dw_read_clear_intrbits_slave()
137 dw_readl(dev, DW_IC_CLR_RX_DONE); in i2c_dw_read_clear_intrbits_slave()
139 dw_readl(dev, DW_IC_CLR_ACTIVITY); in i2c_dw_read_clear_intrbits_slave()
141 dw_readl(dev, DW_IC_CLR_STOP_DET); in i2c_dw_read_clear_intrbits_slave()
143 dw_readl(dev, DW_IC_CLR_START_DET); in i2c_dw_read_clear_intrbits_slave()
145 dw_readl(dev, DW_IC_CLR_GEN_CALL); in i2c_dw_read_clear_intrbits_slave()
155 static int i2c_dw_irq_handler_slave(struct dw_i2c_dev *dev) in i2c_dw_irq_handler_slave() argument
160 stat = dw_readl(dev, DW_IC_INTR_STAT); in i2c_dw_irq_handler_slave()
161 enabled = dw_readl(dev, DW_IC_ENABLE); in i2c_dw_irq_handler_slave()
162 raw_stat = dw_readl(dev, DW_IC_RAW_INTR_STAT); in i2c_dw_irq_handler_slave()
163 slave_activity = ((dw_readl(dev, DW_IC_STATUS) & in i2c_dw_irq_handler_slave()
166 if (!enabled || !(raw_stat & ~DW_IC_INTR_ACTIVITY) || !dev->slave) in i2c_dw_irq_handler_slave()
169 dev_dbg(dev->dev, in i2c_dw_irq_handler_slave()
174 i2c_slave_event(dev->slave, I2C_SLAVE_WRITE_REQUESTED, &val); in i2c_dw_irq_handler_slave()
179 val = dw_readl(dev, DW_IC_DATA_CMD); in i2c_dw_irq_handler_slave()
181 if (!i2c_slave_event(dev->slave, in i2c_dw_irq_handler_slave()
184 dev_vdbg(dev->dev, "Byte %X acked!", in i2c_dw_irq_handler_slave()
187 dw_readl(dev, DW_IC_CLR_RD_REQ); in i2c_dw_irq_handler_slave()
188 stat = i2c_dw_read_clear_intrbits_slave(dev); in i2c_dw_irq_handler_slave()
190 dw_readl(dev, DW_IC_CLR_RD_REQ); in i2c_dw_irq_handler_slave()
191 dw_readl(dev, DW_IC_CLR_RX_UNDER); in i2c_dw_irq_handler_slave()
192 stat = i2c_dw_read_clear_intrbits_slave(dev); in i2c_dw_irq_handler_slave()
194 if (!i2c_slave_event(dev->slave, in i2c_dw_irq_handler_slave()
197 dw_writel(dev, val, DW_IC_DATA_CMD); in i2c_dw_irq_handler_slave()
202 if (!i2c_slave_event(dev->slave, I2C_SLAVE_READ_PROCESSED, in i2c_dw_irq_handler_slave()
204 dw_readl(dev, DW_IC_CLR_RX_DONE); in i2c_dw_irq_handler_slave()
206 i2c_slave_event(dev->slave, I2C_SLAVE_STOP, &val); in i2c_dw_irq_handler_slave()
207 stat = i2c_dw_read_clear_intrbits_slave(dev); in i2c_dw_irq_handler_slave()
212 val = dw_readl(dev, DW_IC_DATA_CMD); in i2c_dw_irq_handler_slave()
213 if (!i2c_slave_event(dev->slave, I2C_SLAVE_WRITE_RECEIVED, in i2c_dw_irq_handler_slave()
215 dev_vdbg(dev->dev, "Byte %X acked!", val); in i2c_dw_irq_handler_slave()
217 i2c_slave_event(dev->slave, I2C_SLAVE_STOP, &val); in i2c_dw_irq_handler_slave()
218 stat = i2c_dw_read_clear_intrbits_slave(dev); in i2c_dw_irq_handler_slave()
226 struct dw_i2c_dev *dev = dev_id; in i2c_dw_isr_slave() local
229 i2c_dw_read_clear_intrbits_slave(dev); in i2c_dw_isr_slave()
230 ret = i2c_dw_irq_handler_slave(dev); in i2c_dw_isr_slave()
232 complete(&dev->cmd_complete); in i2c_dw_isr_slave()
243 int i2c_dw_probe_slave(struct dw_i2c_dev *dev) in i2c_dw_probe_slave() argument
245 struct i2c_adapter *adap = &dev->adapter; in i2c_dw_probe_slave()
248 init_completion(&dev->cmd_complete); in i2c_dw_probe_slave()
250 dev->init = i2c_dw_init_slave; in i2c_dw_probe_slave()
251 dev->disable = i2c_dw_disable; in i2c_dw_probe_slave()
252 dev->disable_int = i2c_dw_disable_int; in i2c_dw_probe_slave()
254 ret = i2c_dw_set_reg_access(dev); in i2c_dw_probe_slave()
258 ret = i2c_dw_set_sda_hold(dev); in i2c_dw_probe_slave()
262 ret = dev->init(dev); in i2c_dw_probe_slave()
270 adap->dev.parent = dev->dev; in i2c_dw_probe_slave()
271 i2c_set_adapdata(adap, dev); in i2c_dw_probe_slave()
273 ret = devm_request_irq(dev->dev, dev->irq, i2c_dw_isr_slave, in i2c_dw_probe_slave()
274 IRQF_SHARED, dev_name(dev->dev), dev); in i2c_dw_probe_slave()
276 dev_err(dev->dev, "failure requesting irq %i: %d\n", in i2c_dw_probe_slave()
277 dev->irq, ret); in i2c_dw_probe_slave()
283 dev_err(dev->dev, "failure adding adapter: %d\n", ret); in i2c_dw_probe_slave()