162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Handling of a sram zone for bestcomm
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2007 Sylvain Munaut <tnt@246tNt.com>
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * This file is licensed under the terms of the GNU General Public License
862306a36Sopenharmony_ci * version 2. This program is licensed "as is" without any warranty of any
962306a36Sopenharmony_ci * kind, whether express or implied.
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#ifndef __BESTCOMM_SRAM_H__
1362306a36Sopenharmony_ci#define __BESTCOMM_SRAM_H__
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <asm/rheap.h>
1662306a36Sopenharmony_ci#include <asm/mmu.h>
1762306a36Sopenharmony_ci#include <linux/spinlock.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci/* Structure used internally */
2162306a36Sopenharmony_ci	/* The internals are here for the inline functions
2262306a36Sopenharmony_ci	 * sake, certainly not for the user to mess with !
2362306a36Sopenharmony_ci	 */
2462306a36Sopenharmony_cistruct bcom_sram {
2562306a36Sopenharmony_ci	phys_addr_t		 base_phys;
2662306a36Sopenharmony_ci	void 			*base_virt;
2762306a36Sopenharmony_ci	unsigned int		 size;
2862306a36Sopenharmony_ci	rh_info_t		*rh;
2962306a36Sopenharmony_ci	spinlock_t		 lock;
3062306a36Sopenharmony_ci};
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ciextern struct bcom_sram *bcom_sram;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci/* Public API */
3662306a36Sopenharmony_ciextern int  bcom_sram_init(struct device_node *sram_node, char *owner);
3762306a36Sopenharmony_ciextern void bcom_sram_cleanup(void);
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ciextern void* bcom_sram_alloc(int size, int align, phys_addr_t *phys);
4062306a36Sopenharmony_ciextern void  bcom_sram_free(void *ptr);
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistatic inline phys_addr_t bcom_sram_va2pa(void *va) {
4362306a36Sopenharmony_ci	return bcom_sram->base_phys +
4462306a36Sopenharmony_ci		(unsigned long)(va - bcom_sram->base_virt);
4562306a36Sopenharmony_ci}
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistatic inline void *bcom_sram_pa2va(phys_addr_t pa) {
4862306a36Sopenharmony_ci	return bcom_sram->base_virt +
4962306a36Sopenharmony_ci		(unsigned long)(pa - bcom_sram->base_phys);
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#endif  /* __BESTCOMM_SRAM_H__ */
5462306a36Sopenharmony_ci
55