diff options
Diffstat (limited to 'arch/powerpc/sysdev/qe_lib/qe.c')
| -rw-r--r-- | arch/powerpc/sysdev/qe_lib/qe.c | 36 | 
1 files changed, 28 insertions, 8 deletions
diff --git a/arch/powerpc/sysdev/qe_lib/qe.c b/arch/powerpc/sysdev/qe_lib/qe.c index 90020de4dcf..238a07b97f2 100644 --- a/arch/powerpc/sysdev/qe_lib/qe.c +++ b/arch/powerpc/sysdev/qe_lib/qe.c @@ -1,5 +1,5 @@  /* - * Copyright (C) 2006 Freescale Semicondutor, Inc. All rights reserved. + * Copyright (C) 2006-2010 Freescale Semiconductor, Inc. All rights reserved.   *   * Authors: 	Shlomi Gridish <gridish@freescale.com>   * 		Li Yang <leoli@freescale.com> @@ -216,7 +216,7 @@ int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier)  	/* Errata QE_General4, which affects some MPC832x and MPC836x SOCs, says  	   that the BRG divisor must be even if you're not using divide-by-16  	   mode. */ -	if (!div16 && (divisor & 1)) +	if (!div16 && (divisor & 1) && (divisor > 3))  		divisor++;  	tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | @@ -266,7 +266,19 @@ EXPORT_SYMBOL(qe_clock_source);  static void qe_snums_init(void)  {  	int i; -	static const u8 snum_init[] = { +	static const u8 snum_init_76[] = { +		0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D, +		0x24, 0x25, 0x2C, 0x2D, 0x34, 0x35, 0x88, 0x89, +		0x98, 0x99, 0xA8, 0xA9, 0xB8, 0xB9, 0xC8, 0xC9, +		0xD8, 0xD9, 0xE8, 0xE9, 0x44, 0x45, 0x4C, 0x4D, +		0x54, 0x55, 0x5C, 0x5D, 0x64, 0x65, 0x6C, 0x6D, +		0x74, 0x75, 0x7C, 0x7D, 0x84, 0x85, 0x8C, 0x8D, +		0x94, 0x95, 0x9C, 0x9D, 0xA4, 0xA5, 0xAC, 0xAD, +		0xB4, 0xB5, 0xBC, 0xBD, 0xC4, 0xC5, 0xCC, 0xCD, +		0xD4, 0xD5, 0xDC, 0xDD, 0xE4, 0xE5, 0xEC, 0xED, +		0xF4, 0xF5, 0xFC, 0xFD, +	}; +	static const u8 snum_init_46[] = {  		0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0x1C, 0x1D,  		0x24, 0x25, 0x2C, 0x2D, 0x34, 0x35, 0x88, 0x89,  		0x98, 0x99, 0xA8, 0xA9, 0xB8, 0xB9, 0xC8, 0xC9, @@ -274,9 +286,15 @@ static void qe_snums_init(void)  		0x28, 0x29, 0x38, 0x39, 0x48, 0x49, 0x58, 0x59,  		0x68, 0x69, 0x78, 0x79, 0x80, 0x81,  	}; +	static const u8 *snum_init;  	qe_num_of_snum = qe_get_num_of_snums(); +	if (qe_num_of_snum == 76) +		snum_init = snum_init_76; +	else +		snum_init = snum_init_46; +  	for (i = 0; i < qe_num_of_snum; i++) {  		snums[i].num = snum_init[i];  		snums[i].state = QE_SNUM_STATE_FREE; @@ -377,12 +395,15 @@ static void qe_upload_microcode(const void *base,  	for (i = 0; i < be32_to_cpu(ucode->count); i++)  		out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i])); +	 +	/* Set I-RAM Ready Register */ +	out_be32(&qe_immr->iram.iready, be32_to_cpu(QE_IRAM_READY));  }  /*   * Upload a microcode to the I-RAM at a specific address.   * - * See Documentation/powerpc/qe-firmware.txt for information on QE microcode + * See Documentation/powerpc/qe_firmware.txt for information on QE microcode   * uploading.   *   * Currently, only version 1 is supported, so the 'version' field must be @@ -659,8 +680,7 @@ static int qe_resume(struct platform_device *ofdev)  	return 0;  } -static int qe_probe(struct platform_device *ofdev, -		    const struct of_device_id *id) +static int qe_probe(struct platform_device *ofdev)  {  	return 0;  } @@ -670,7 +690,7 @@ static const struct of_device_id qe_ids[] = {  	{ },  }; -static struct of_platform_driver qe_driver = { +static struct platform_driver qe_driver = {  	.driver = {  		.name = "fsl-qe",  		.owner = THIS_MODULE, @@ -682,7 +702,7 @@ static struct of_platform_driver qe_driver = {  static int __init qe_drv_init(void)  { -	return of_register_platform_driver(&qe_driver); +	return platform_driver_register(&qe_driver);  }  device_initcall(qe_drv_init);  #endif /* defined(CONFIG_SUSPEND) && defined(CONFIG_PPC_85xx) */  | 
