@@ -973,12 +973,57 @@ void fsi_driver_unregister(struct fsi_driver *fsi_drv)
int fsi_enable_irq(struct fsi_device *dev)
{
+ int rc;
+ uint32_t si1m;
+ uint32_t bit = 0x80000000 >> dev->si1s_bit;
+ struct fsi_master *master = dev->slave->master;
+
+ if (!dev->irq_handler)
+ return -EINVAL;
+
+ rc = master->read(master, 0, 0, FSI_SLAVE_BASE + FSI_SI1M, &si1m,
+ sizeof(uint32_t));
+ if (rc) {
+ dev_err(&master->dev, "Coudn't read si1m:%d\n", rc);
+ return rc;
+ }
+
+ si1m |= bit;
+ rc = master->write(master, 0, 0, FSI_SLAVE_BASE + FSI_SI1M, &si1m,
+ sizeof(uint32_t));
+ if (rc) {
+ dev_err(&master->dev, "Coudn't write si1m:%d\n", rc);
+ return rc;
+ }
+
+ master->ipoll |= bit;
return 0;
}
EXPORT_SYMBOL(fsi_enable_irq);
void fsi_disable_irq(struct fsi_device *dev)
{
+ int rc;
+ uint32_t si1m;
+ uint32_t bits = ~(0x80000000 >> dev->si1s_bit);
+ struct fsi_master *master = dev->slave->master;
+
+ master->ipoll &= bits;
+
+ rc = master->read(master, 0, 0, FSI_SLAVE_BASE + FSI_SI1M, &si1m,
+ sizeof(uint32_t));
+ if (rc) {
+ dev_err(&master->dev, "Couldn't read si1m:%d\n", rc);
+ return;
+ }
+
+ si1m &= bits;
+ rc = master->write(master, 0, 0, FSI_SLAVE_BASE + FSI_SI1M, &si1m,
+ sizeof(uint32_t));
+ if (rc) {
+ dev_err(&master->dev, "Coudn't write si1m:%d\n", rc);
+ return;
+ }
}
EXPORT_SYMBOL(fsi_disable_irq);