[linux-yocto] [PATCH 09/15] arch/arm/mach-axxia: added support for ncr_read/ncr_write() to access PCIe/SRIO SerDes Config in 0x115 node

Bruce Ashfield bruce.ashfield at windriver.com
Thu Jan 30 11:56:57 PST 2014


On 14-01-20 12:56 PM, Charlie Paul wrote:
> From: SangeethaRao <sangeetha.rao at lsi.com>
>
> Signed-off-by: SangeethaRao <sangeetha.rao at lsi.com>
> ---
>   arch/arm/mach-axxia/ncr.c |  134 +++++++++++++++++++++++++++++++++++++++++----
>   1 file changed, 122 insertions(+), 12 deletions(-)
>
> diff --git a/arch/arm/mach-axxia/ncr.c b/arch/arm/mach-axxia/ncr.c
> index 58b959a..7af2e97 100644
> --- a/arch/arm/mach-axxia/ncr.c
> +++ b/arch/arm/mach-axxia/ncr.c
> @@ -203,7 +203,6 @@ ncr_unlock(int domain)
>     ----------------------------------------------------------------------
>     ncr_read
>   */
> -

Minor 'nit. This is the sort of whitespace change that should be quickly
checked before sending a patch. It may seem minor, but over time patches
with these sort of changes make maintenance and merges more difficult.

Bruce

>   int
>   ncr_read(unsigned long region, unsigned long address, int number,
>   	 void *buffer)
> @@ -224,7 +223,7 @@ ncr_read(unsigned long region, unsigned long address, int number,
>   	if (0 != ncr_lock(LOCK_DOMAIN))
>   		return -1;
>
> -	if (NCP_NODE_ID(region) != 0x0153) {
> +	if ((NCP_NODE_ID(region) != 0x0153) && (NCP_NODE_ID(region) != 0x115)) {
>   		/*
>   		Set up the read command.
>   		*/
> @@ -274,6 +273,7 @@ ncr_read(unsigned long region, unsigned long address, int number,
>   			*((unsigned long *) buffer) =
>   				ncr_register_read((unsigned *) address);
>   			address += 4;
> +			buffer += 4;
>   			number -= 4;
>   		}
>
> @@ -284,17 +284,76 @@ ncr_read(unsigned long region, unsigned long address, int number,
>   		}
>   	} else {
>   #ifdef APB2SER_PHY_PHYS_ADDRESS
> -		void __iomem *targ_address = apb2ser0_address +
> +		if (NCP_NODE_ID(region) != 0x115) {
> +			void __iomem *targ_address = apb2ser0_address +
>   				(address & (~0x3));
> -		/*
> -		Copy data words to the buffer.
> -		*/
> +			/*
> +			* Copy data words to the buffer.
> +			*/
> +
> +			while (4 <= number) {
> +				*((unsigned long *) buffer) =
> +					*((unsigned long *) targ_address);
> +				targ_address += 4;
> +				number -= 4;
> +			}
> +		} else {
> +			void __iomem *base;
> +			if (0xffff < address) {
> +				ncr_unlock(LOCK_DOMAIN);
> +				return -1;
> +			}
> +
> +			switch (NCP_TARGET_ID(region)) {
> +			case 0:
> +				base = (apb2ser0_address + 0x1e0);
> +				break;
> +			case 1:
> +				base = (apb2ser0_address + 0x1f0);
> +				break;
> +			case 2:
> +				base = (apb2ser0_address + 0x200);
> +				break;
> +			case 3:
> +				base = (apb2ser0_address + 0x210);
> +				break;
> +			case 4:
> +				base = (apb2ser0_address + 0x220);
> +				break;
> +			case 5:
> +				base = (apb2ser0_address + 0x230);
> +				break;
> +			default:
> +				ncr_unlock(LOCK_DOMAIN);
> +				return -1;
> +			}
> +			if ((NCP_TARGET_ID(region) == 0x1) ||
> +				(NCP_TARGET_ID(region) == 0x4)) {
> +				writel((0x84c00000 + address), (base + 4));
> +			} else {
> +				writel((0x85400000 + address), (base + 4));
> +			}
> +			do {
> +				--wfc_timeout;
> +				*((unsigned long *) buffer) =
> +					readl(base + 4);
> +			} while (0 != (*((unsigned long *) buffer) & 0x80000000)
> +					&& 0 < wfc_timeout);
> +
> +			if (0 == wfc_timeout) {
> +				ncr_unlock(LOCK_DOMAIN);
> +				return -1;
> +			}
> +
> +			if ((NCP_TARGET_ID(region) == 0x1) ||
> +				(NCP_TARGET_ID(region) == 0x4)) {
> +				*((unsigned short *) buffer) =
> +					readl(base + 8);
> +			} else {
> +				*((unsigned long *) buffer) =
> +					readl(base + 8);
> +			}
>
> -		while (4 <= number) {
> -			*((unsigned long *) buffer) =
> -				*((unsigned long *) targ_address);
> -			targ_address += 4;
> -			number -= 4;
>   		}
>   #else
>   		ncr_unlock(LOCK_DOMAIN);
> @@ -335,7 +394,7 @@ ncr_write(unsigned long region, unsigned long address, int number,
>   	if (0 != ncr_lock(LOCK_DOMAIN))
>   		return -1;
>
> -	if (NCP_NODE_ID(region) != 0x0153) {
> +	if ((NCP_NODE_ID(region) != 0x0153) && (NCP_NODE_ID(region) != 0x115)) {
>   		/*
>   		  Set up the write.
>   		*/
> @@ -416,6 +475,7 @@ ncr_write(unsigned long region, unsigned long address, int number,
>   		}
>   	} else {
>   #ifdef APB2SER_PHY_PHYS_ADDRESS
> +	if (NCP_NODE_ID(region) != 0x115) {
>   		void __iomem *targ_address = apb2ser0_address +
>   					     (address & (~0x3));
>   		/*
> @@ -428,6 +488,56 @@ ncr_write(unsigned long region, unsigned long address, int number,
>   			targ_address += 4;
>   			number -= 4;
>   		}
> +	} else {
> +		void __iomem *base;
> +		if (0xffff < address) {
> +			ncr_unlock(LOCK_DOMAIN);
> +			return -1;
> +		}
> +
> +		switch (NCP_TARGET_ID(region)) {
> +			case 0:
> +				base = (apb2ser0_address + 0x1e0);
> +				break;
> +			case 1:
> +				base = (apb2ser0_address + 0x1f0);
> +				break;
> +			case 2:
> +				base = (apb2ser0_address + 0x200);
> +				break;
> +			case 3:
> +				base = (apb2ser0_address + 0x210);
> +				break;
> +			case 4:
> +				base = (apb2ser0_address + 0x220);
> +				break;
> +			case 5:
> +				base = (apb2ser0_address + 0x230);
> +				break;
> +			default:
> +				ncr_unlock(LOCK_DOMAIN);
> +				return -1;
> +		}
> +		if ((NCP_TARGET_ID(region) == 0x1) ||
> +				(NCP_TARGET_ID(region) == 0x4)) {
> +			writel(*((unsigned short *) buffer), base);
> +			writel((0xc4c00000 + address), (base + 4));
> +		} else {
> +			writel(*((unsigned long *) buffer), base);
> +			writel((0xc5400000 + address), (base + 4));
> +		}
> +			do {
> +				--wfc_timeout;
> +				*((unsigned long *) buffer) =
> +					readl(base + 4);
> +			} while (0 != (*((unsigned long *) buffer) & 0x80000000)
> +				&& 0 < wfc_timeout);
> +
> +			if (0 == wfc_timeout) {
> +				ncr_unlock(LOCK_DOMAIN);
> +				return -1;
> +			}
> +		}
>   #else
>   		ncr_unlock(LOCK_DOMAIN);
>   		return -1;
>



More information about the linux-yocto mailing list