2019-06-04 10:11:33 +02:00
// SPDX-License-Identifier: GPL-2.0-only
2005-04-16 15:20:36 -07:00
/*
* linux / arch / arm / mach - integrator / core . c
*
* Copyright ( C ) 2000 - 2003 Deep Blue Solutions Ltd
*/
# include <linux/types.h>
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/device.h>
2012-08-04 10:31:24 +00:00
# include <linux/export.h>
2005-04-16 15:20:36 -07:00
# include <linux/spinlock.h>
# include <linux/interrupt.h>
2006-07-01 22:32:32 +01:00
# include <linux/irq.h>
2010-05-22 19:47:18 +01:00
# include <linux/memblock.h>
2005-04-16 15:20:36 -07:00
# include <linux/sched.h>
2005-06-18 10:15:46 +01:00
# include <linux/smp.h>
2006-01-07 13:52:45 +00:00
# include <linux/amba/bus.h>
2006-03-26 23:13:39 +01:00
# include <linux/amba/serial.h>
2008-09-06 12:10:45 +01:00
# include <linux/io.h>
2012-11-02 01:31:10 +01:00
# include <linux/stat.h>
2013-06-16 02:44:27 +02:00
# include <linux/of.h>
# include <linux/of_address.h>
2020-06-08 21:32:42 -07:00
# include <linux/pgtable.h>
2005-04-16 15:20:36 -07:00
2011-12-20 11:55:19 +01:00
# include <asm/mach-types.h>
2005-04-16 15:20:36 -07:00
# include <asm/mach/time.h>
2014-02-13 21:26:24 +01:00
# include "hardware.h"
2013-06-16 02:44:27 +02:00
# include "cm.h"
2012-09-06 09:08:47 +01:00
# include "common.h"
2009-07-03 08:44:46 -05:00
static DEFINE_RAW_SPINLOCK ( cm_lock ) ;
2013-06-16 02:44:27 +02:00
static void __iomem * cm_base ;
2005-04-16 15:20:36 -07:00
2013-10-10 14:11:18 +02:00
/**
* cm_get - get the value from the CM_CTRL register
*/
u32 cm_get ( void )
{
return readl ( cm_base + INTEGRATOR_HDR_CTRL_OFFSET ) ;
}
2005-04-16 15:20:36 -07:00
/**
* cm_control - update the CM_CTRL register .
* @ mask : bits to change
* @ set : bits to set
*/
void cm_control ( u32 mask , u32 set )
{
unsigned long flags ;
u32 val ;
2009-07-03 08:44:46 -05:00
raw_spin_lock_irqsave ( & cm_lock , flags ) ;
2013-06-16 02:44:27 +02:00
val = readl ( cm_base + INTEGRATOR_HDR_CTRL_OFFSET ) & ~ mask ;
writel ( val | set , cm_base + INTEGRATOR_HDR_CTRL_OFFSET ) ;
2009-07-03 08:44:46 -05:00
raw_spin_unlock_irqrestore ( & cm_lock , flags ) ;
2005-04-16 15:20:36 -07:00
}
2013-06-16 02:44:27 +02:00
void cm_clear_irqs ( void )
{
/* disable core module IRQs */
writel ( 0xffffffffU , cm_base + INTEGRATOR_HDR_IC_OFFSET +
IRQ_ENABLE_CLEAR ) ;
}
static const struct of_device_id cm_match [ ] = {
{ . compatible = " arm,core-module-integrator " } ,
{ } ,
} ;
void cm_init ( void )
{
struct device_node * cm = of_find_matching_node ( NULL , cm_match ) ;
if ( ! cm ) {
pr_crit ( " no core module node found in device tree \n " ) ;
return ;
}
cm_base = of_iomap ( cm , 0 ) ;
if ( ! cm_base ) {
pr_crit ( " could not remap core module \n " ) ;
return ;
}
cm_clear_irqs ( ) ;
}
2010-05-22 18:18:57 +01:00
/*
* We need to stop things allocating the low memory ; ideally we need a
* better implementation of GFP_DMA which does not assume that DMA - able
* memory starts at zero .
*/
void __init integrator_reserve ( void )
{
2010-05-22 19:47:18 +01:00
memblock_reserve ( PHYS_OFFSET , __pa ( swapper_pg_dir ) - PHYS_OFFSET ) ;
2010-05-22 18:18:57 +01:00
}