1a21765a70ec06be175d3997320a83fa66fcc8955Ben Dooks/* linux/arch/arm/mach-s3c2440/dsc.c
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (c) 2004-2005 Simtec Electronics
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *   Ben Dooks <ben@simtec.co.uk>
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Samsung S3C2440 Drive Strength Control support
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License version 2 as
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * published by the Free Software Foundation.
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*/
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h>
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/interrupt.h>
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
18fced80c735941fa518ac67c0b61bbe153fb8c050Russell King#include <linux/io.h>
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mach/arch.h>
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mach/map.h>
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mach/irq.h>
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
24a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/hardware.h>
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/irq.h>
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
27a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/regs-gpio.h>
28a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/regs-dsc.h>
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30a2b7ba9ca471438c2bb0c3bdf0ff2ed7fdce3d2fBen Dooks#include <plat/cpu.h>
3184c9b7271a0af08c4e5fce3901a0ad3d952036bcBen Dooks#include <plat/s3c244x.h>
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint s3c2440_set_dsc(unsigned int pin, unsigned int value)
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void __iomem *base;
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long val;
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long flags;
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long mask;
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	base = (pin & S3C2440_SELECT_DSC1) ? S3C2440_DSC1 : S3C2440_DSC0;
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mask = 3 << S3C2440_DSC_GETSHIFT(pin);
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	local_irq_save(flags);
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	val = __raw_readl(base);
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	val &= ~mask;
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	val |= value & mask;
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	__raw_writel(val, base);
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	local_irq_restore(flags);
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(s3c2440_set_dsc);
55