diff options
Diffstat (limited to 'drivers/pci/controller/dwc')
| -rw-r--r-- | drivers/pci/controller/dwc/pcie-dw-rockchip.c | 42 | 
1 files changed, 26 insertions, 16 deletions
diff --git a/drivers/pci/controller/dwc/pcie-dw-rockchip.c b/drivers/pci/controller/dwc/pcie-dw-rockchip.c index b5f5eee5a50e..5d7f6f544942 100644 --- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c +++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c @@ -11,6 +11,7 @@  #include <linux/bitfield.h>  #include <linux/clk.h>  #include <linux/gpio/consumer.h> +#include <linux/hw_bitfield.h>  #include <linux/irqchip/chained_irq.h>  #include <linux/irqdomain.h>  #include <linux/mfd/syscon.h> @@ -29,18 +30,18 @@   * The upper 16 bits of PCIE_CLIENT_CONFIG are a write   * mask for the lower 16 bits.   */ -#define HIWORD_UPDATE(mask, val) (((mask) << 16) | (val)) -#define HIWORD_UPDATE_BIT(val)	HIWORD_UPDATE(val, val) -#define HIWORD_DISABLE_BIT(val)	HIWORD_UPDATE(val, ~val)  #define to_rockchip_pcie(x) dev_get_drvdata((x)->dev)  /* General Control Register */  #define PCIE_CLIENT_GENERAL_CON		0x0 -#define  PCIE_CLIENT_RC_MODE		HIWORD_UPDATE_BIT(0x40) -#define  PCIE_CLIENT_EP_MODE		HIWORD_UPDATE(0xf0, 0x0) -#define  PCIE_CLIENT_ENABLE_LTSSM	HIWORD_UPDATE_BIT(0xc) -#define  PCIE_CLIENT_DISABLE_LTSSM	HIWORD_UPDATE(0x0c, 0x8) +#define  PCIE_CLIENT_MODE_MASK		GENMASK(7, 4) +#define  PCIE_CLIENT_MODE_EP		0x0UL +#define  PCIE_CLIENT_MODE_RC		0x4UL +#define  PCIE_CLIENT_SET_MODE(x)	FIELD_PREP_WM16(PCIE_CLIENT_MODE_MASK, (x)) +#define  PCIE_CLIENT_LD_RQ_RST_GRT	FIELD_PREP_WM16(BIT(3), 1) +#define  PCIE_CLIENT_ENABLE_LTSSM	FIELD_PREP_WM16(BIT(2), 1) +#define  PCIE_CLIENT_DISABLE_LTSSM	FIELD_PREP_WM16(BIT(2), 0)  /* Interrupt Status Register Related to Legacy Interrupt */  #define PCIE_CLIENT_INTR_STATUS_LEGACY	0x8 @@ -52,6 +53,11 @@  /* Interrupt Mask Register Related to Legacy Interrupt */  #define PCIE_CLIENT_INTR_MASK_LEGACY	0x1c +#define  PCIE_INTR_MASK			GENMASK(7, 0) +#define  PCIE_INTR_CLAMP(_x)		((BIT((_x)) & PCIE_INTR_MASK)) +#define  PCIE_INTR_LEGACY_MASK(x)	(PCIE_INTR_CLAMP((x)) | \ +					 (PCIE_INTR_CLAMP((x)) << 16)) +#define  PCIE_INTR_LEGACY_UNMASK(x)	(PCIE_INTR_CLAMP((x)) << 16)  /* Interrupt Mask Register Related to Miscellaneous Operation */  #define PCIE_CLIENT_INTR_MASK_MISC	0x24 @@ -116,14 +122,14 @@ static void rockchip_pcie_intx_handler(struct irq_desc *desc)  static void rockchip_intx_mask(struct irq_data *data)  {  	rockchip_pcie_writel_apb(irq_data_get_irq_chip_data(data), -				 HIWORD_UPDATE_BIT(BIT(data->hwirq)), +				 PCIE_INTR_LEGACY_MASK(data->hwirq),  				 PCIE_CLIENT_INTR_MASK_LEGACY);  };  static void rockchip_intx_unmask(struct irq_data *data)  {  	rockchip_pcie_writel_apb(irq_data_get_irq_chip_data(data), -				 HIWORD_DISABLE_BIT(BIT(data->hwirq)), +				 PCIE_INTR_LEGACY_UNMASK(data->hwirq),  				 PCIE_CLIENT_INTR_MASK_LEGACY);  }; @@ -489,7 +495,7 @@ static irqreturn_t rockchip_pcie_ep_sys_irq_thread(int irq, void *arg)  		dev_dbg(dev, "hot reset or link-down reset\n");  		dw_pcie_ep_linkdown(&pci->ep);  		/* Stop delaying link training. */ -		val = HIWORD_UPDATE_BIT(PCIE_LTSSM_APP_DLY2_DONE); +		val = FIELD_PREP_WM16(PCIE_LTSSM_APP_DLY2_DONE, 1);  		rockchip_pcie_writel_apb(rockchip, val,  					 PCIE_CLIENT_HOT_RESET_CTRL);  	} @@ -528,10 +534,11 @@ static int rockchip_pcie_configure_rc(struct platform_device *pdev,  	}  	/* LTSSM enable control mode */ -	val = HIWORD_UPDATE_BIT(PCIE_LTSSM_ENABLE_ENHANCE); +	val = FIELD_PREP_WM16(PCIE_LTSSM_ENABLE_ENHANCE, 1);  	rockchip_pcie_writel_apb(rockchip, val, PCIE_CLIENT_HOT_RESET_CTRL); -	rockchip_pcie_writel_apb(rockchip, PCIE_CLIENT_RC_MODE, +	rockchip_pcie_writel_apb(rockchip, +				 PCIE_CLIENT_SET_MODE(PCIE_CLIENT_MODE_RC),  				 PCIE_CLIENT_GENERAL_CON);  	pp = &rockchip->pci.pp; @@ -545,7 +552,7 @@ static int rockchip_pcie_configure_rc(struct platform_device *pdev,  	}  	/* unmask DLL up/down indicator */ -	val = HIWORD_UPDATE(PCIE_RDLH_LINK_UP_CHGED, 0); +	val = FIELD_PREP_WM16(PCIE_RDLH_LINK_UP_CHGED, 0);  	rockchip_pcie_writel_apb(rockchip, val, PCIE_CLIENT_INTR_MASK_MISC);  	return ret; @@ -577,10 +584,12 @@ static int rockchip_pcie_configure_ep(struct platform_device *pdev,  	 * LTSSM enable control mode, and automatically delay link training on  	 * hot reset/link-down reset.  	 */ -	val = HIWORD_UPDATE_BIT(PCIE_LTSSM_ENABLE_ENHANCE | PCIE_LTSSM_APP_DLY2_EN); +	val = FIELD_PREP_WM16(PCIE_LTSSM_ENABLE_ENHANCE, 1) | +	      FIELD_PREP_WM16(PCIE_LTSSM_APP_DLY2_EN, 1);  	rockchip_pcie_writel_apb(rockchip, val, PCIE_CLIENT_HOT_RESET_CTRL); -	rockchip_pcie_writel_apb(rockchip, PCIE_CLIENT_EP_MODE, +	rockchip_pcie_writel_apb(rockchip, +				 PCIE_CLIENT_SET_MODE(PCIE_CLIENT_MODE_EP),  				 PCIE_CLIENT_GENERAL_CON);  	rockchip->pci.ep.ops = &rockchip_pcie_ep_ops; @@ -604,7 +613,8 @@ static int rockchip_pcie_configure_ep(struct platform_device *pdev,  	pci_epc_init_notify(rockchip->pci.ep.epc);  	/* unmask DLL up/down indicator and hot reset/link-down reset */ -	val = HIWORD_UPDATE(PCIE_RDLH_LINK_UP_CHGED | PCIE_LINK_REQ_RST_NOT_INT, 0); +	val = FIELD_PREP_WM16(PCIE_RDLH_LINK_UP_CHGED, 0) | +	      FIELD_PREP_WM16(PCIE_LINK_REQ_RST_NOT_INT, 0);  	rockchip_pcie_writel_apb(rockchip, val, PCIE_CLIENT_INTR_MASK_MISC);  	return ret;  | 
