• Krzysztof Kozlowski's avatar
    pinctrl: samsung: Fix NULL pointer exception on external interrupts on S3C24xx · cee7413d
    Krzysztof Kozlowski authored
    After commit 8b1bd11c ("pinctrl: samsung: Add the support the
    multiple IORESOURCE_MEM for one pin-bank"), the S3C24xx (and probably
    S3C64xx as well) fails:
    
    	Unable to handle kernel NULL pointer dereference at virtual address 000000a8
    	...
    	(s3c24xx_demux_eint4_7) from [<c004469c>] (__handle_domain_irq+0x6c/0xcc)
    	(__handle_domain_irq) from [<c0009444>] (s3c24xx_handle_irq+0x6c/0x12c)
    	(s3c24xx_handle_irq) from [<c000e5fc>] (__irq_svc+0x5c/0x78)
    
    Mentioned commit moved the pointer to controller's base IO memory address
    from each controller's driver data (samsung_pinctrl_drv_data) to per-bank
    structure (samsung_pin_bank).  The external interrupt demux
    handlers (s3c24xx_demux_eint()) tried to get this base address from opaque
    pointer stored under irq_chip data:
    
    	struct irq_data *irqd = irq_desc_get_irq_data(desc);
    	struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
    	...
    	pend = readl(bank->eint_base + EINTPEND_REG);
    
    which is wrong because this is hardware irq and it bank was never set
    for this irq_chip.
    
    For S3C24xx and S3C64xx, this partially reverts mentioned commit by
    bringing back the virt_base stored under each controller's driver data
    (samsung_pinctrl_drv_data).  This virt_base address will be now
    duplicated:
     - samsung_pinctrl_drv_data->virt_base: used on S3C24xx and S3C64xx,
     - samsung_pin_bank->pctl_base: used on Exynos.
    
    Fixes: 8b1bd11c ("pinctrl: samsung: Add the support the multiple IORESOURCE_MEM for one pin-bank")
    Cc: <stable@vger.kernel.org>
    Cc: Sergio Prado <sergio.prado@e-labworks.com>
    Reported-by: default avatarSergio Prado <sergio.prado@e-labworks.com>
    Signed-off-by: default avatarKrzysztof Kozlowski <krzk@kernel.org>
    Tested-by: default avatarLihua Yao <ylhuajnu@163.com>
    cee7413d
pinctrl-s3c64xx.c 19.5 KB