2019-06-04 10:11:33 +02:00
// SPDX-License-Identifier: GPL-2.0-only
2009-01-28 12:27:37 -07:00
/*
* SMS / SDRC ( SDRAM controller ) common code for OMAP2 / 3
*
* Copyright ( C ) 2005 , 2008 Texas Instruments Inc .
* Copyright ( C ) 2005 , 2008 Nokia Corporation
*
* Tony Lindgren < tony @ atomide . com >
* Paul Walmsley
* Richard Woodruff < r - woodruff2 @ ti . com >
*/
2009-01-28 12:27:39 -07:00
# undef DEBUG
2009-01-28 12:27:37 -07:00
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/device.h>
# include <linux/list.h>
# include <linux/errno.h>
# include <linux/delay.h>
# include <linux/clk.h>
# include <linux/io.h>
2012-09-27 10:33:34 -06:00
# include "common.h"
# include "clock.h"
2009-01-28 12:27:37 -07:00
# include "sdrc.h"
2009-07-24 19:43:25 -06:00
static struct omap_sdrc_params * sdrc_init_params_cs0 , * sdrc_init_params_cs1 ;
2009-01-28 12:27:39 -07:00
2009-01-28 12:27:37 -07:00
void __iomem * omap2_sdrc_base ;
void __iomem * omap2_sms_base ;
2009-05-13 13:32:11 +03:00
struct omap2_sms_regs {
u32 sms_sysconfig ;
} ;
static struct omap2_sms_regs sms_context ;
2009-05-12 17:27:09 -06:00
/* SDRC_POWER register bits */
# define SDRC_POWER_EXTCLKDIS_SHIFT 3
# define SDRC_POWER_PWDENA_SHIFT 2
# define SDRC_POWER_PAGEPOLICY_SHIFT 0
2009-01-28 12:27:39 -07:00
2009-05-13 13:32:11 +03:00
/**
* omap2_sms_save_context - Save SMS registers
*
* Save SMS registers that need to be restored after off mode .
*/
2022-09-28 17:09:42 +02:00
static void omap2_sms_save_context ( void )
2009-05-13 13:32:11 +03:00
{
sms_context . sms_sysconfig = sms_read_reg ( SMS_SYSCONFIG ) ;
}
/**
* omap2_sms_restore_context - Restore SMS registers
*
* Restore SMS registers that need to be Restored after off mode .
*/
void omap2_sms_restore_context ( void )
{
sms_write_reg ( sms_context . sms_sysconfig , SMS_SYSCONFIG ) ;
}
2012-10-29 20:50:21 -06:00
void __init omap2_set_globals_sdrc ( void __iomem * sdrc , void __iomem * sms )
2009-01-28 12:27:37 -07:00
{
2012-10-29 20:50:21 -06:00
omap2_sdrc_base = sdrc ;
omap2_sms_base = sms ;
2009-01-28 12:27:37 -07:00
}
2009-05-12 17:27:09 -06:00
/**
* omap2_sdrc_init - initialize SMS , SDRC devices on boot
2009-07-24 19:43:25 -06:00
* @ sdrc_cs [ 01 ] : pointers to a null - terminated list of struct omap_sdrc_params
* Support for 2 chip selects timings
2009-05-12 17:27:09 -06:00
*
* Turn on smart idle modes for SDRAM scheduler and controller .
* Program a known - good configuration for the SDRC to deal with buggy
* bootloaders .
*/
2009-07-24 19:43:25 -06:00
void __init omap2_sdrc_init ( struct omap_sdrc_params * sdrc_cs0 ,
struct omap_sdrc_params * sdrc_cs1 )
2009-01-28 12:27:37 -07:00
{
u32 l ;
l = sms_read_reg ( SMS_SYSCONFIG ) ;
l & = ~ ( 0x3 < < 3 ) ;
l | = ( 0x2 < < 3 ) ;
sms_write_reg ( l , SMS_SYSCONFIG ) ;
l = sdrc_read_reg ( SDRC_SYSCONFIG ) ;
l & = ~ ( 0x3 < < 3 ) ;
l | = ( 0x2 < < 3 ) ;
sdrc_write_reg ( l , SDRC_SYSCONFIG ) ;
2009-01-28 12:27:39 -07:00
2009-07-24 19:43:25 -06:00
sdrc_init_params_cs0 = sdrc_cs0 ;
sdrc_init_params_cs1 = sdrc_cs1 ;
2009-05-12 17:27:09 -06:00
/* XXX Enable SRFRONIDLEREQ here also? */
2009-07-24 19:44:01 -06:00
/*
* PWDENA should not be set due to 34 xx erratum 1.150 - PWDENA
* can cause random memory corruption
*/
2009-05-12 17:27:09 -06:00
l = ( 1 < < SDRC_POWER_EXTCLKDIS_SHIFT ) |
( 1 < < SDRC_POWER_PAGEPOLICY_SHIFT ) ;
sdrc_write_reg ( l , SDRC_POWER ) ;
2009-05-13 13:32:11 +03:00
omap2_sms_save_context ( ) ;
2009-01-28 12:27:37 -07:00
}