@@ -45,6 +45,7 @@ static const char *amd_asf_port_name = " port 1";
struct amd_asf_dev {
struct i2c_adapter adap;
+ void __iomem *eoi_base;
struct device *dev;
struct i2c_client *target;
struct delayed_work work_buf;
@@ -292,12 +293,14 @@ static irqreturn_t amd_asf_irq_handler(int irq, void *ptr)
amd_asf_update_bits(piix4_smba, ASF_SLV_INTR, SMBHSTSTS, true);
}
+ iowrite32(irq, dev->eoi_base);
return IRQ_HANDLED;
}
static int amd_asf_probe(struct platform_device *pdev)
{
struct amd_asf_dev *asf_dev;
+ struct resource *eoi_addr;
int ret, irq;
asf_dev = devm_kzalloc(&pdev->dev, sizeof(*asf_dev), GFP_KERNEL);
@@ -312,6 +315,14 @@ static int amd_asf_probe(struct platform_device *pdev)
if (!asf_dev->port_addr)
return dev_err_probe(&pdev->dev, -EINVAL, "missing IO resources\n");
+ eoi_addr = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!eoi_addr)
+ return dev_err_probe(&pdev->dev, -EINVAL, "missing MEM resources\n");
+
+ asf_dev->eoi_base = devm_ioremap(&pdev->dev, eoi_addr->start, resource_size(eoi_addr));
+ if (!asf_dev->eoi_base)
+ return dev_err_probe(&pdev->dev, -EBUSY, "failed mapping IO region\n");
+
INIT_DELAYED_WORK(&asf_dev->work_buf, amd_asf_process_target);
irq = platform_get_irq(pdev, 0);