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