1. 08 May, 2007 40 commits
    • David Brownell's avatar
      rtc: remove "RTC_ALM_SET mode" bugs · f8245c26
      David Brownell authored
      This fixes a common glitch in how RTC drivers handle two "set alarm" modes,
      by getting rid of the surprising/hidden one that was rarely implemented
      correctly (and which could expose nonportable hardware-specific behavior).
      
      The glitch comes from the /dev/rtcX logic implementing the legacy
      RTC_ALM_SET (limited to 24 hours, needing RTC_AIE_ON) ioctl on top of the
      RTC driver call providing access to the newer RTC_WKALM_SET (without those
      limitations) by initializing the day/month/year fields to be invalid ...
      that second mode.
      
      Now, since few RTC drivers check those fields, and most hardware misbehaves
      when faced with invalid date fields, many RTC drivers will set bogus alarm
      times on those RTC_ALM_SET code paths.  (Several in-tree drivers have that
      issue, and I also noticed it with code reviews on several new RTC drivers.)
      
      This patch ensures that RTC drivers never see such invalid alarm fields, by
      moving some logic out of rtc-omap into the RTC_ALM_SET code and adding an
      explicit check (which will prevent the issue on other code paths).
      Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
      Cc: Scott Wood <scottwood@freescale.com>
      Cc: Alessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      f8245c26
    • Andrew Morton's avatar
      revert "rtc: Add rtc_merge_alarm()" · 416ce32e
      Andrew Morton authored
      David says "884b4aaa should be reverted.  It
      added an rtc_merge_alarm() call to the 2.6.20 kernel, which hasn't yet been
      used by any in-tree driver; this patch obviates the need for that call, and
      uses a more robust approach."
      
      Cc: Scott Wood <scottwood@freescale.com>
      Cc: Alessandro Zummo <a.zummo@towertech.it>
      Cc: David Brownell <david-b@pacbell.net>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      416ce32e
    • David Brownell's avatar
      workaround rtc-related acpi table bugs · 19bfe37c
      David Brownell authored
      This works around a bug seen in some RTC-related ACPI table entries, and
      tweaks related diagnostics to follow the ACPI convention.
      
      The bug prevents misleading boot-time messages: platforms affected by this
      bug wrongly report they can support alarms up to one year in the future,
      when in fact the longest alarm is just 24 hours.  That will surprise anyone
      trying to use those extended alarms.
      Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
      Cc: Alessandro Zummo <a.zummo@towertech.it>
      Cc: Len Brown <lenb@kernel.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      19bfe37c
    • David Brownell's avatar
      ACPI wakeup hooks for rtc-cmos · f5f72b46
      David Brownell authored
      Remove /proc/acpi/alarm file when the rtc-cmos "wakealarm" file is available.
      Instead, provide hooks that rtc-cmos will use.
      Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
      Cc: Alessandro Zummo <a.zummo@towertech.it>
      Cc: Len Brown <lenb@kernel.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      f5f72b46
    • David Brownell's avatar
      rtc-cmos wakeup interface · 87ac84f4
      David Brownell authored
      I finally got around to testing the updated wakeup event hooks for rtc-cmos,
      and they follow in two patches:
      
       - Interface update ... when a simple enable_irq_wake() doesn't suffice,
         the platform data can hold suspend/resume callback hooks.
      
       - ACPI implementation ... provides callback hooks to do ACPI magic, and
         eliminate the legacy /proc/acpi/alarm file.
      
      The interface update could go into 2.6.21, but that's not essential; they
      will be NOPs on most PCs, without the ACPI stuff.
      
      I suspect the ACPI folk may have opinions about how to merge that second
      patch, and how to obsolete that legacy procfs file.  I'd like to see that
      merge into 2.6.22 if possible...
      
      As for how to kick it in ... two ways:
      
       - The appended "rtcwake" program; updated since the last time it was
         posted, it deals much better with timezones and DST.
      
       - Write the /sys/class/rtc/.../wakealarm file, then go to sleep.
      
      For some reason RTC wake from "swsusp" stopped working on a system where
      it previously worked; the alarm setting appears to get clobbered.  But
      on the bright side, RTC wake from "standby" worked on a system that had
      never been able to resume from that state before ... IDEACPI is my guess
      as to why it finally started to work.  It's the old "two steps forward,
      one step back" dance, I guess.
      
      - Dave
      
      /* gcc -Wall -Os -o rtcwake rtcwake.c */
      
      #include <stdio.h>
      #include <getopt.h>
      #include <fcntl.h>
      #include <stdlib.h>
      #include <string.h>
      #include <unistd.h>
      #include <errno.h>
      #include <time.h>
      
      #include <sys/ioctl.h>
      #include <sys/time.h>
      #include <sys/types.h>
      
      #include <linux/rtc.h>
      
      /* constants from legacy PC/AT hardware */
      #define	RTC_PF	0x40
      #define	RTC_AF	0x20
      #define	RTC_UF	0x10
      
      /*
       * rtcwake -- enter a system sleep state until specified wakeup time.
       *
       * This uses cross-platform Linux interfaces to enter a system sleep state,
       * and leave it no later than a specified time.  It uses any RTC framework
       * driver that supports standard driver model wakeup flags.
       *
       * This is normally used like the old "apmsleep" utility, to wake from a
       * suspend state like ACPI S1 (standby) or S3 (suspend-to-RAM).  Most
       * platforms can implement those without analogues of BIOS, APM, or ACPI.
       *
       * On some systems, this can also be used like "nvram-wakeup", waking
       * from states like ACPI S4 (suspend to disk).  Not all systems have
       * persistent media that are appropriate for such suspend modes.
       *
       * The best way to set the system's RTC is so that it holds the current
       * time in UTC.  Use the "-l" flag to tell this program that the system
       * RTC uses a local timezone instead (maybe you dual-boot MS-Windows).
       */
      
      static char		*progname;
      
      #ifdef	DEBUG
      #define	VERSION	"1.0 dev (" __DATE__ " " __TIME__ ")"
      #else
      #define	VERSION	"0.9"
      #endif
      
      static unsigned		verbose;
      static int		rtc_is_utc = -1;
      
      static int may_wakeup(const char *devname)
      {
      	char	buf[128], *s;
      	FILE	*f;
      
      	snprintf(buf, sizeof buf, "/sys/class/rtc/%s/device/power/wakeup",
      			devname);
      	f = fopen(buf, "r");
      	if (!f) {
      		perror(buf);
      		return 0;
      	}
      	fgets(buf, sizeof buf, f);
      	fclose(f);
      
      	s = strchr(buf, '\n');
      	if (!s)
      		return 0;
      	*s = 0;
      
      	/* wakeup events could be disabled or not supported */
      	return strcmp(buf, "enabled") == 0;
      }
      
      /* all times should be in UTC */
      static time_t	sys_time;
      static time_t	rtc_time;
      
      static int get_basetimes(int fd)
      {
      	struct tm	tm;
      	struct rtc_time	rtc;
      
      	/* this process works in RTC time, except when working
      	 * with the system clock (which always uses UTC).
      	 */
      	if (rtc_is_utc)
      		setenv("TZ", "UTC", 1);
      	tzset();
      
      	/* read rtc and system clocks "at the same time", or as
      	 * precisely (+/- a second) as we can read them.
      	 */
      	if (ioctl(fd, RTC_RD_TIME, &rtc) < 0) {
      		perror("read rtc time");
      		return 0;
      	}
      	sys_time = time(0);
      	if (sys_time == (time_t)-1) {
      		perror("read system time");
      		return 0;
      	}
      
      	/* convert rtc_time to normal arithmetic-friendly form,
      	 * updating tm.tm_wday as used by asctime().
      	 */
      	memset(&tm, 0, sizeof tm);
      	tm.tm_sec = rtc.tm_sec;
      	tm.tm_min = rtc.tm_min;
      	tm.tm_hour = rtc.tm_hour;
      	tm.tm_mday = rtc.tm_mday;
      	tm.tm_mon = rtc.tm_mon;
      	tm.tm_year = rtc.tm_year;
      	tm.tm_isdst = rtc.tm_isdst;	/* stays unspecified? */
      	rtc_time = mktime(&tm);
      
      	if (rtc_time == (time_t)-1) {
      		perror("convert rtc time");
      		return 0;
      	}
      
      	if (verbose) {
      		if (!rtc_is_utc) {
      			printf("\ttzone   = %ld\n", timezone);
      			printf("\ttzname  = %s\n", tzname[daylight]);
      			gmtime_r(&rtc_time, &tm);
      		}
      		printf("\tsystime = %ld, (UTC) %s",
      				(long) sys_time, asctime(gmtime(&sys_time)));
      		printf("\trtctime = %ld, (UTC) %s",
      				(long) rtc_time, asctime(&tm));
      	}
      
      	return 1;
      }
      
      static int setup_alarm(int fd, time_t *wakeup)
      {
      	struct tm		*tm;
      	struct rtc_wkalrm	wake;
      
      	tm = gmtime(wakeup);
      
      	wake.time.tm_sec = tm->tm_sec;
      	wake.time.tm_min = tm->tm_min;
      	wake.time.tm_hour = tm->tm_hour;
      	wake.time.tm_mday = tm->tm_mday;
      	wake.time.tm_mon = tm->tm_mon;
      	wake.time.tm_year = tm->tm_year;
      	wake.time.tm_wday = tm->tm_wday;
      	wake.time.tm_yday = tm->tm_yday;
      	wake.time.tm_isdst = tm->tm_isdst;
      
      	/* many rtc alarms only support up to 24 hours from 'now' ... */
      	if ((rtc_time + (24 * 60 * 60)) > *wakeup) {
      		if (ioctl(fd, RTC_ALM_SET, &wake.time) < 0) {
      			perror("set rtc alarm");
      			return 0;
      		}
      		if (ioctl(fd, RTC_AIE_ON, 0) < 0) {
      			perror("enable rtc alarm");
      			return 0;
      		}
      
      	/* ... so use the "more than 24 hours" request only if we must */
      	} else {
      		/* avoid an extra AIE_ON call */
      		wake.enabled = 1;
      
      		if (ioctl(fd, RTC_WKALM_SET, &wake) < 0) {
      			perror("set rtc wake alarm");
      			return 0;
      		}
      	}
      
      	return 1;
      }
      
      static void suspend_system(const char *suspend)
      {
      	FILE	*f = fopen("/sys/power/state", "w");
      
      	if (!f) {
      		perror("/sys/power/state");
      		return;
      	}
      
      	fprintf(f, "%s\n", suspend);
      	fflush(f);
      
      	/* this executes after wake from suspend */
      	fclose(f);
      }
      
      int main(int argc, char **argv)
      {
      	static char		*devname = "rtc0";
      	static unsigned		seconds = 0;
      	static char		*suspend = "standby";
      
      	int		t;
      	int		fd;
      	time_t		alarm = 0;
      
      	progname = strrchr(argv[0], '/');
      	if (progname)
      		progname++;
      	else
      		progname = argv[0];
      	if (chdir("/dev/") < 0) {
      		perror("chdir /dev");
      		return 1;
      	}
      
      	while ((t = getopt(argc, argv, "d:lm:s:t:uVv")) != EOF) {
      		switch (t) {
      
      		case 'd':
      			devname = optarg;
      			break;
      
      		case 'l':
      			rtc_is_utc = 0;
      			break;
      
      		/* what system power mode to use?  for now handle only
      		 * standardized mode names; eventually when systems define
      		 * their own state names, parse /sys/power/state.
      		 *
      		 * "on" is used just to test the RTC alarm mechanism,
      		 * bypassing all the wakeup-from-sleep infrastructure.
      		 */
      		case 'm':
      			if (strcmp(optarg, "standby") == 0
      					|| strcmp(optarg, "mem") == 0
      					|| strcmp(optarg, "disk") == 0
      					|| strcmp(optarg, "on") == 0
      					) {
      				suspend = optarg;
      				break;
      			}
      			printf("%s: unrecognized suspend state '%s'\n",
      					progname, optarg);
      			goto usage;
      
      		/* alarm time, seconds-to-sleep (relative) */
      		case 's':
      			t = atoi(optarg);
      			if (t < 0) {
      				printf("%s: illegal interval %s seconds\n",
      						progname, optarg);
      				goto usage;
      			}
      			seconds = t;
      			break;
      
      		/* alarm time, time_t (absolute, seconds since 1/1 1970 UTC) */
      		case 't':
      			t = atoi(optarg);
      			if (t < 0) {
      				printf("%s: illegal time_t value %s\n",
      						progname, optarg);
      				goto usage;
      			}
      			alarm = t;
      			break;
      
      		case 'u':
      			rtc_is_utc = 1;
      			break;
      
      		case 'v':
      			verbose++;
      			break;
      
      		case 'V':
      			printf("%s: version %s\n", progname, VERSION);
      			break;
      
      		default:
      usage:
      			printf("usage: %s [options]"
      				"\n\t"
      				"-d rtc0|rtc1|...\t(select rtc)"
      				"\n\t"
      				"-l\t\t\t(RTC uses local timezone)"
      				"\n\t"
      				"-m standby|mem|...\t(sleep mode)"
      				"\n\t"
      				"-s seconds\t\t(seconds to sleep)"
      				"\n\t"
      				"-t time_t\t\t(time to wake)"
      				"\n\t"
      				"-u\t\t\t(RTC uses UTC)"
      				"\n\t"
      				"-v\t\t\t(verbose messages)"
      				"\n\t"
      				"-V\t\t\t(show version)"
      				"\n",
      				progname);
      			return 1;
      		}
      	}
      
      	if (!alarm && !seconds) {
      		printf("%s: must provide wake time\n", progname);
      		goto usage;
      	}
      
      	/* REVISIT:  if /etc/adjtime exists, read it to see what
      	 * the util-linux version of hwclock assumes.
      	 */
      	if (rtc_is_utc == -1) {
      		printf("%s: assuming RTC uses UTC ...\n", progname);
      		rtc_is_utc = 1;
      	}
      
      	/* this RTC must exist and (if we'll sleep) be wakeup-enabled */
      	fd = open(devname, O_RDONLY);
      	if (fd < 0) {
      		perror(devname);
      		return 1;
      	}
      	if (strcmp(suspend, "on") != 0 && !may_wakeup(devname)) {
      		printf("%s: %s not enabled for wakeup events\n",
      				progname, devname);
      		return 1;
      	}
      
      	/* relative or absolute alarm time, normalized to time_t */
      	if (!get_basetimes(fd))
      		return 1;
      	if (verbose)
      		printf("alarm %ld, sys_time %ld, rtc_time %ld, seconds %u\n",
      				alarm, sys_time, rtc_time, seconds);
      	if (alarm) {
      		if (alarm < sys_time) {
      			printf("%s: time doesn't go backward to %s",
      					progname, ctime(&alarm));
      			return 1;
      		}
      		alarm += sys_time - rtc_time;
      	} else
      		alarm = rtc_time + seconds + 1;
      	if (setup_alarm(fd, &alarm) < 0)
      		return 1;
      
      	sync();
      	printf("%s: wakeup from \"%s\" using %s at %s",
      			progname, suspend, devname,
      			ctime(&alarm));
      	fflush(stdout);
      	usleep(10 * 1000);
      
      	if (strcmp(suspend, "on") != 0)
      		suspend_system(suspend);
      	else {
      		unsigned long data;
      
      		do {
      			t = read(fd, &data, sizeof data);
      			if (t < 0) {
      				perror("rtc read");
      				break;
      			}
      			if (verbose)
      				printf("... %s: %03lx\n", devname, data);
      		} while (!(data & RTC_AF));
      	}
      
      	if (ioctl(fd, RTC_AIE_OFF, 0) < 0)
      		perror("disable rtc alarm interrupt");
      
      	close(fd);
      	return 0;
      }
      
      This patch:
      
      Make rtc-cmos do the relevant magic so this RTC can wake the system from a
      sleep state.  That magic comes in two basic flavors:
      
       - Straightforward:  enable_irq_wake(), the way it'd work on most SOC chips;
         or generally with system sleep states which don't disable core IRQ logic.
      
       - Roundabout, using non-IRQ platform hooks.  This is needed with ACPI and
         one almost-clone chip which uses a special wakeup-only alarm.  (That's
         the RTC used on Footbridge boards, FWIW, which don't do PM in Linux.)
      
      A separate patch implements those hooks for ACPI platforms, so that rtc_cmos
      can issue system wakeup events (and its sysfs "wakealarm" attribute works on
      at least some systems).
      Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
      Cc: Alessandro Zummo <a.zummo@towertech.it>
      Cc: Len Brown <lenb@kernel.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      87ac84f4
    • Yoichi Yuasa's avatar
      rtc: update vr41xx alarm handling · 9b5ef64a
      Yoichi Yuasa authored
      - vr41xx_rtc_read_alarm() reports alarm enabled.
      - vr41xx_rtc_set_alarm() sets alarm disable/enable by rtc_wkalrm.enabled.
      Signed-off-by: default avatarYoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
      Acked-by: default avatarAlessandro Zummo <a.zummo@towertech.it>
      Acked-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      9b5ef64a
    • Alessandro Zummo's avatar
      RTC Kconfig cleanup · 09a21e56
      Alessandro Zummo authored
      Signed-off-by: default avatarAlessandro Zummo <a.zummo@towertech.it>
      Cc: David Brownell <david-b@pacbell.net>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      09a21e56
    • David Brownell's avatar
      rtc: update to class device removal patches · cb3a58d2
      David Brownell authored
      Fix a goof in the revised classdev support for RTCs: make sure the /dev
      node info is ready before the device is registered, not after.  Otherwise
      the /sys/class/rtc/rtcN/dev attribute won't be created and then udev won't
      have the information it needs to create the /dev/rtcN node.
      Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
      Cc: Alessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      cb3a58d2
    • David Brownell's avatar
    • David Brownell's avatar
      rtc: suspend()/resume() restores system clock · 7ca1d488
      David Brownell authored
      RTC class suspend/resume support, re-initializing the system clock on resume
      from the clock used to initialize it at boot time.
      
       - The reinit-on-resume is hooked to the existing RTC_HCTOSYS config
         option, on the grounds that a clock good enough for init must also
         be good enough for re-init.
      
       - Inlining a version of the code used by ARM, to save and restore the
         delta between a selected RTC and the current system wall-clock time.
      
       - Removes calls to that ARM code from AT91, OMAP1, and S3C RTCs.  This
         means that systems using those RTCs across suspend/resume will likely
         want to change their kernel configs to enable RTC_HCTOSYS.
      
         If HCTOSYS isn't using a second RTC (with battery?), this changes the
         system's initial date from Jan 1970 to the epoch this hardware uses:
         1998 for AT91, 2000 for OMAP1 (assuming no split power mode), etc.
      
      This goes on top of the patch series removing "struct class_device" usage
      from the RTC framework.  That's all needed for class suspend()/resume().
      Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
      Acked-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      Acked-By: default avatarAlessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      7ca1d488
    • David Brownell's avatar
      rtc: remove rest of class_device · cd966209
      David Brownell authored
      Finish converting the RTC framework so it no longer uses class_device.
      Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
      Acked-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      Acked-By: default avatarAlessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      cd966209
    • David Brownell's avatar
      rtc: simplified /proc/driver/rtc handling · 7d9f99ec
      David Brownell authored
      This simplifies the RTC procfs support by removing the class_interface that
      hooks it into the rtc core.  If it's configured, then sysfs support is now
      part of the RTC core, and is never a separate module.
      
      It also removes the class_interface hook, now that its last remaining user is
      gone.  (That API is usable only with a "struct class_device".)
      
      It's another step towards being able to remove "struct class_device".
      Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
      Acked-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      Acked-By: default avatarAlessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      7d9f99ec
    • David Brownell's avatar
      rtc: simplified rtc sysfs attribute handling · 446ecbd9
      David Brownell authored
      This simplifies the RTC sysfs support by removing the class_interface that
      hooks it into the rtc core.  If it's configured, then sysfs support is now
      part of the RTC core, and is never a separate module.
      
      It's another step towards being able to remove "struct class_device".
      Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
      Acked-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      Acked-By: default avatarAlessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      446ecbd9
    • David Brownell's avatar
      rtc: rtc interfaces don't use class_device · ab6a2d70
      David Brownell authored
      This patch removes class_device from the programming interface that the RTC
      framework exposes to the rest of the kernel.  Now an rtc_device is passed,
      which is more type-safe and streamlines all the relevant code.
      Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
      Acked-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      Acked-By: default avatarAlessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      ab6a2d70
    • David Brownell's avatar
      rtc: remove /sys/class/rtc-dev/* · 5726fb20
      David Brownell authored
      This simplifies the /dev support by removing a superfluous class_device (the
      /sys/class/rtc-dev stuff) and the class_interface that hooks it into the rtc
      core.  Accordingly, if it's configured then /dev support is now part of the
      RTC core, and is never a separate module.
      
      It's another step towards being able to remove "struct class_device".
      
      [bunk@stusta.de: drivers/rtc/rtc-dev.c should #include "rtc-core.h"]
      Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
      Acked-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
      Acked-By: default avatarAlessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: default avatarAdrian Bunk <bunk@stusta.de>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      5726fb20
    • Ulrich Drepper's avatar
      utimensat implementation · 1c710c89
      Ulrich Drepper authored
      Implement utimensat(2) which is an extension to futimesat(2) in that it
      
      a) supports nano-second resolution for the timestamps
      b) allows to selectively ignore the atime/mtime value
      c) allows to selectively use the current time for either atime or mtime
      d) supports changing the atime/mtime of a symlink itself along the lines
         of the BSD lutimes(3) functions
      
      For this change the internally used do_utimes() functions was changed to
      accept a timespec time value and an additional flags parameter.
      
      Additionally the sys_utime function was changed to match compat_sys_utime
      which already use do_utimes instead of duplicating the work.
      
      Also, the completely missing futimensat() functionality is added.  We have
      such a function in glibc but we have to resort to using /proc/self/fd/* which
      not everybody likes (chroot etc).
      
      Test application (the syscall number will need per-arch editing):
      
      #include <errno.h>
      #include <fcntl.h>
      #include <time.h>
      #include <sys/time.h>
      #include <stddef.h>
      #include <syscall.h>
      
      #define __NR_utimensat 280
      
      #define UTIME_NOW       ((1l << 30) - 1l)
      #define UTIME_OMIT      ((1l << 30) - 2l)
      
      int
      main(void)
      {
        int status = 0;
      
        int fd = open("ttt", O_RDWR|O_CREAT|O_EXCL, 0666);
        if (fd == -1)
          error (1, errno, "failed to create test file \"ttt\"");
      
        struct stat64 st1;
        if (fstat64 (fd, &st1) != 0)
          error (1, errno, "fstat failed");
      
        struct timespec t[2];
        t[0].tv_sec = 0;
        t[0].tv_nsec = 0;
        t[1].tv_sec = 0;
        t[1].tv_nsec = 0;
        if (syscall(__NR_utimensat, AT_FDCWD, "ttt", t, 0) != 0)
          error (1, errno, "utimensat failed");
      
        struct stat64 st2;
        if (fstat64 (fd, &st2) != 0)
          error (1, errno, "fstat failed");
      
        if (st2.st_atim.tv_sec != 0 || st2.st_atim.tv_nsec != 0)
          {
            puts ("atim not reset to zero");
            status = 1;
          }
        if (st2.st_mtim.tv_sec != 0 || st2.st_mtim.tv_nsec != 0)
          {
            puts ("mtim not reset to zero");
            status = 1;
          }
        if (status != 0)
          goto out;
      
        t[0] = st1.st_atim;
        t[1].tv_sec = 0;
        t[1].tv_nsec = UTIME_OMIT;
        if (syscall(__NR_utimensat, AT_FDCWD, "ttt", t, 0) != 0)
          error (1, errno, "utimensat failed");
      
        if (fstat64 (fd, &st2) != 0)
          error (1, errno, "fstat failed");
      
        if (st2.st_atim.tv_sec != st1.st_atim.tv_sec
            || st2.st_atim.tv_nsec != st1.st_atim.tv_nsec)
          {
            puts ("atim not set");
            status = 1;
          }
        if (st2.st_mtim.tv_sec != 0 || st2.st_mtim.tv_nsec != 0)
          {
            puts ("mtim changed from zero");
            status = 1;
          }
        if (status != 0)
          goto out;
      
        t[0].tv_sec = 0;
        t[0].tv_nsec = UTIME_OMIT;
        t[1] = st1.st_mtim;
        if (syscall(__NR_utimensat, AT_FDCWD, "ttt", t, 0) != 0)
          error (1, errno, "utimensat failed");
      
        if (fstat64 (fd, &st2) != 0)
          error (1, errno, "fstat failed");
      
        if (st2.st_atim.tv_sec != st1.st_atim.tv_sec
            || st2.st_atim.tv_nsec != st1.st_atim.tv_nsec)
          {
            puts ("mtim changed from original time");
            status = 1;
          }
        if (st2.st_mtim.tv_sec != st1.st_mtim.tv_sec
            || st2.st_mtim.tv_nsec != st1.st_mtim.tv_nsec)
          {
            puts ("mtim not set");
            status = 1;
          }
        if (status != 0)
          goto out;
      
        sleep (2);
      
        t[0].tv_sec = 0;
        t[0].tv_nsec = UTIME_NOW;
        t[1].tv_sec = 0;
        t[1].tv_nsec = UTIME_NOW;
        if (syscall(__NR_utimensat, AT_FDCWD, "ttt", t, 0) != 0)
          error (1, errno, "utimensat failed");
      
        if (fstat64 (fd, &st2) != 0)
          error (1, errno, "fstat failed");
      
        struct timeval tv;
        gettimeofday(&tv,NULL);
      
        if (st2.st_atim.tv_sec <= st1.st_atim.tv_sec
            || st2.st_atim.tv_sec > tv.tv_sec)
          {
            puts ("atim not set to NOW");
            status = 1;
          }
        if (st2.st_mtim.tv_sec <= st1.st_mtim.tv_sec
            || st2.st_mtim.tv_sec > tv.tv_sec)
          {
            puts ("mtim not set to NOW");
            status = 1;
          }
      
        if (symlink ("ttt", "tttsym") != 0)
          error (1, errno, "cannot create symlink");
      
        t[0].tv_sec = 0;
        t[0].tv_nsec = 0;
        t[1].tv_sec = 0;
        t[1].tv_nsec = 0;
        if (syscall(__NR_utimensat, AT_FDCWD, "tttsym", t, AT_SYMLINK_NOFOLLOW) != 0)
          error (1, errno, "utimensat failed");
      
        if (lstat64 ("tttsym", &st2) != 0)
          error (1, errno, "lstat failed");
      
        if (st2.st_atim.tv_sec != 0 || st2.st_atim.tv_nsec != 0)
          {
            puts ("symlink atim not reset to zero");
            status = 1;
          }
        if (st2.st_mtim.tv_sec != 0 || st2.st_mtim.tv_nsec != 0)
          {
            puts ("symlink mtim not reset to zero");
            status = 1;
          }
        if (status != 0)
          goto out;
      
        t[0].tv_sec = 1;
        t[0].tv_nsec = 0;
        t[1].tv_sec = 1;
        t[1].tv_nsec = 0;
        if (syscall(__NR_utimensat, fd, NULL, t, 0) != 0)
          error (1, errno, "utimensat failed");
      
        if (fstat64 (fd, &st2) != 0)
          error (1, errno, "fstat failed");
      
        if (st2.st_atim.tv_sec != 1 || st2.st_atim.tv_nsec != 0)
          {
            puts ("atim not reset to one");
            status = 1;
          }
        if (st2.st_mtim.tv_sec != 1 || st2.st_mtim.tv_nsec != 0)
          {
            puts ("mtim not reset to one");
            status = 1;
          }
      
        if (status == 0)
           puts ("all OK");
      
       out:
        close (fd);
        unlink ("ttt");
        unlink ("tttsym");
      
        return status;
      }
      
      [akpm@linux-foundation.org: add missing i386 syscall table entry]
      Signed-off-by: default avatarUlrich Drepper <drepper@redhat.com>
      Cc: Alexey Dobriyan <adobriyan@openvz.org>
      Cc: Michael Kerrisk <mtk-manpages@gmx.net>
      Cc: <linux-arch@vger.kernel.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      1c710c89
    • Josh Triplett's avatar
      rcutorture: Remove redundant assignment to cur_ops in for loop · ade5fb81
      Josh Triplett authored
      The for loop in rcutorture_init uses the condition
      cur_ops = torture_ops[i], cur_ops
      but then makes the same assignment to cur_ops inside the loop.  Remove the
      redundant assignment inside the loop, and remove now-unnecessary braces.
      Signed-off-by: default avatarJosh Triplett <josh@kernel.org>
      Cc: "Paul E. McKenney" <paulmck@us.ibm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      ade5fb81
    • Josh Triplett's avatar
      rcutorture: style cleanup: avoid != NULL in boolean tests · c8e5b163
      Josh Triplett authored
      Signed-off-by: default avatarJosh Triplett <josh@kernel.org>
      Cc: "Paul E. McKenney" <paulmck@us.ibm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      c8e5b163
    • Ahmed S. Darwish's avatar
      rcutorture: Use ARRAY_SIZE macro when appropriate · 788e770e
      Ahmed S. Darwish authored
      Use ARRAY_SIZE macro already defined in kernel.h
      Signed-off-by: default avatarAhmed S. Darwish <darwish.07@gmail.com>
      Cc: "Paul E. McKenney" <paulmck@us.ibm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      788e770e
    • Siddha, Suresh B's avatar
      sched: align rq to cacheline boundary · c3396620
      Siddha, Suresh B authored
      Align the per cpu runqueue to the cacheline boundary.  This will minimize
      the number of cachelines touched during remote wakeup.
      Signed-off-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
      Acked-by: default avatarIngo Molnar <mingo@elte.hu>
      Cc: Ravikiran G Thirumalai <kiran@scalex86.org>
      Cc: Nick Piggin <nickpiggin@yahoo.com.au>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      c3396620
    • Dmitry Adamushko's avatar
      sched: redundant reschedule when set_user_nice() boosts a prio of a task from the "expired" array · bd53f96c
      Dmitry Adamushko authored
      - Make TASK_PREEMPTS_CURR(task, rq) return "true" only if the task's prio
        is higher than the current's one and the task is in the "active" array.
        This ensures we don't make redundant resched_task() calls when the task
        is in the "expired" array (as may happen now in set_user_prio(),
        rt_mutex_setprio() and pull_task() ) ;
      
      - generalise conditions for a call to resched_task() in set_user_nice(),
        rt_mutex_setprio() and sched_setscheduler()
      Signed-off-by: default avatarDmitry Adamushko <dmitry.adamushko@gmail.com>
      Cc: Con Kolivas <kernel@kolivas.org>
      Acked-by: default avatarIngo Molnar <mingo@elte.hu>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      bd53f96c
    • Siddha, Suresh B's avatar
      sched: optimize siblings status check logic in wake_idle() · 4953198b
      Siddha, Suresh B authored
      When a logical cpu 'x' already has more than one process running, then most
      likely the siblings of that cpu 'x' must be busy.  Otherwise the idle
      siblings would have likely(in most of the scenarios) picked up the extra
      load making the load on 'x' atmost one.
      
      Use this logic to eliminate the siblings status check and minimize the cache
      misses encountered on a heavily loaded system.
      Signed-off-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
      Cc: Nick Piggin <nickpiggin@yahoo.com.au>
      Acked-by: default avatarIngo Molnar <mingo@elte.hu>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      4953198b
    • Eric Dumazet's avatar
      Speed up divides by cpu_power in scheduler · 5517d86b
      Eric Dumazet authored
      I noticed expensive divides done in try_to_wakeup() and
      find_busiest_group() on a bi dual core Opteron machine (total of 4 cores),
      moderatly loaded (15.000 context switch per second)
      
      oprofile numbers :
      
      CPU: AMD64 processors, speed 2600.05 MHz (estimated)
      Counted CPU_CLK_UNHALTED events (Cycles outside of halt state) with a unit
      mask of 0x00 (No unit mask) count 50000
      samples  %        symbol name
      ...
      613914    1.0498  try_to_wake_up
          834  0.0013 :ffffffff80227ae1:   div    %rcx
      77513  0.1191 :ffffffff80227ae4:   mov    %rax,%r11
      
      608893    1.0413  find_busiest_group
         1841  0.0031 :ffffffff802260bf:       div    %rdi
      140109  0.2394 :ffffffff802260c2:       test   %sil,%sil
      
      Some of these divides can use the reciprocal divides we introduced some
      time ago (currently used in slab AFAIK)
      
      We can assume a load will fit in a 32bits number, because with a
      SCHED_LOAD_SCALE=128 value, its still a theorical limit of 33554432
      
      When/if we reach this limit one day, probably cpus will have a fast
      hardware divide and we can zap the reciprocal divide trick.
      
      Ingo suggested to rename cpu_power to __cpu_power to make clear it should
      not be modified without changing its reciprocal value too.
      
      I did not convert the divide in cpu_avg_load_per_task(), because tracking
      nr_running changes may be not worth it ?  We could use a static table of 32
      reciprocal values but it would add a conditional branch and table lookup.
      
      [akpm@linux-foundation.org: !SMP build fix]
      Signed-off-by: default avatarEric Dumazet <dada1@cosmosbay.com>
      Acked-by: default avatarIngo Molnar <mingo@elte.hu>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      5517d86b
    • Siddha, Suresh B's avatar
      sched: dynticks idle load balancing · 46cb4b7c
      Siddha, Suresh B authored
      Fix the process idle load balancing in the presence of dynticks.  cpus for
      which ticks are stopped will sleep till the next event wakes it up.
      Potentially these sleeps can be for large durations and during which today,
      there is no periodic idle load balancing being done.
      
      This patch nominates an owner among the idle cpus, which does the idle load
      balancing on behalf of the other idle cpus.  And once all the cpus are
      completely idle, then we can stop this idle load balancing too.  Checks added
      in fast path are minimized.  Whenever there are busy cpus in the system, there
      will be an owner(idle cpu) doing the system wide idle load balancing.
      
      Open items:
      1. Intelligent owner selection (like an idle core in a busy package).
      2. Merge with rcu's nohz_cpu_mask?
      Signed-off-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
      Acked-by: default avatarIngo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Nick Piggin <nickpiggin@yahoo.com.au>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      46cb4b7c
    • Siddha, Suresh B's avatar
      sched: fix idle load balancing in softirqd context · bdecea3a
      Siddha, Suresh B authored
      Periodic load balancing in recent kernels happen in the softirq.  In
      certain -rt configurations, these softirqs are handled in softirqd context.
       And hence the check for idle processor was always returning busy (as
      nr_running > 1).
      
      This patch captures the idle information at the tick and passes this info
      to softirq context through an element 'idle_at_tick' in rq.
      
      [kernel@kolivas.org: Fix reverse idle at tick logic]
      Signed-off-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
      Acked-by: default avatarIngo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Nick Piggin <nickpiggin@yahoo.com.au>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      bdecea3a
    • Thomas Gleixner's avatar
      ISDN: Spinlock initializer cleanup · 2bd7e20e
      Thomas Gleixner authored
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Cc: Karsten Keil <kkeil@suse.de>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      2bd7e20e
    • Matthias Kaehlcke's avatar
      use mutex instead of semaphore in CAPI 2.0 interface · 9ea6e5d8
      Matthias Kaehlcke authored
      The CAPI 2.0 interface uses a semaphore as mutex.  Use the mutex API instead
      of the (binary) semaphore.
      Signed-off-by: default avatarMatthias Kaehlcke <matthias.kaehlcke@gmail.com>
      Cc: Karsten Keil <kkeil@suse.de>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      9ea6e5d8
    • Mike Frysinger's avatar
      sanitize linux/isdn_divertif.h for userspace · a7e27d5d
      Mike Frysinger authored
      the isdn_divertif contains kernel-only references so I've wrapped them in
      __KERNEL__ and add proper #include statements.
      Signed-off-by: default avatarMike Frysinger <vapier@gentoo.org>
      Cc: Karsten Keil <kkeil@suse.de>
      Cc: David Woodhouse <dwmw2@infradead.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      a7e27d5d
    • Matthias Kaehlcke's avatar
      fix spinlock usage in hysdn_log_close() · 635244c5
      Matthias Kaehlcke authored
      Fix incorrect spinlock use in hysdn_log_close().  The function declared a
      spinlock on the stack and used it to 'protect' a shared driver structure.
      
      The patch simply removes the useless code.
      Signed-off-by: default avatarMatthias Kaehlcke <matthias.kaehlcke@gmail.com>
      Cc: Karsten Keil <kkeil@suse.de>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      635244c5
    • Armin Schindler's avatar
      drivers/isdn/hardware/eicon/: remove unused header files · 13af68ee
      Armin Schindler authored
      As pointed out by Robert P.  J.  Day, here is a patch to remove unused
      header files from Eicon/Dialogic ISDN driver.
      Signed-off-by: default avatarArmin Schindler <armin@melware.de>
      Acked-by: default avatarKarsten Keil <kkeil@suse.de>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      13af68ee
    • Adrian Bunk's avatar
    • Jeff Layton's avatar
      inode numbering: change libfs sb creation routines to avoid collisions with their root inodes · 1a1c9bb4
      Jeff Layton authored
      This patch makes it so that simple_fill_super and get_sb_pseudo assign their
      root inodes to be number 1.  It also fixes up a couple of callers of
      simple_fill_super that were passing in files arrays that had an index at
      number 1, and adds a warning for any caller that sends in such an array.
      
      It would have been nice to have made it so that it wasn't possible to make
      such a collision, but some callers need to be able to control what inode
      number their entries get, so I think this is the best that can be done.
      Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
      Cc: Christoph Hellwig <hch@lst.de>
      Cc: Al Viro <viro@zeniv.linux.org.uk>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      1a1c9bb4
    • Jeff Layton's avatar
      inode numbering: make static counters in new_inode and iunique be 32 bits · 866b04fc
      Jeff Layton authored
      The problems are:
      
      - on filesystems w/o permanent inode numbers, i_ino values can be larger
        than 32 bits, which can cause problems for some 32 bit userspace programs on
        a 64 bit kernel.  We can't do anything for filesystems that have actual
        >32-bit inode numbers, but on filesystems that generate i_ino values on the
        fly, we should try to have them fit in 32 bits.  We could trivially fix this
        by making the static counters in new_inode and iunique 32 bits, but...
      
      - many filesystems call new_inode and assume that the i_ino values they are
        given are unique.  They are not guaranteed to be so, since the static
        counter can wrap.  This problem is exacerbated by the fix for #1.
      
      - after allocating a new inode, some filesystems call iunique to try to get
        a unique i_ino value, but they don't actually add their inodes to the
        hashtable, and so they're still not guaranteed to be unique if that counter
        wraps.
      
      This patch set takes the simpler approach of simply using iunique and hashing
      the inodes afterward.  Christoph H.  previously mentioned that he thought that
      this approach may slow down lookups for filesystems that currently hash their
      inodes.
      
      The questions are:
      
      1) how much would this slow down lookups for these filesystems?
      2) is it enough to justify adding more infrastructure to avoid it?
      
      What might be best is to start with this approach and then only move to using
      IDR or some other scheme if these extra inodes in the hashtable prove to be
      problematic.
      
      I've done some cursory testing with this patch and the overhead of hashing and
      unhashing the inodes with pipefs is pretty low -- just a few seconds of system
      time added on to the creation and destruction of 10 million pipes (very
      similar to the overhead that the IDR approach would add).
      
      The hard thing to measure is what effect this has on other filesystems. I'm
      open to ways to try and gauge this.
      
      Again, I've only converted pipefs as an example. If this approach is
      acceptable then I'll start work on patches to convert other filesystems.
      
      With a pretty-much-worst-case microbenchmark provided by Eric Dumazet
      <dada1@cosmosbay.com>:
      
      hashing patch (pipebench):
      sys     1m15.329s
      sys     1m16.249s
      sys     1m17.169s
      
      unpatched (pipebench):
      sys     1m9.836s
      sys     1m12.541s
      sys     1m14.153s
      
      Which works out to 1.05642174294555027017.  So ~5-6% slowdown.
      
      This patch:
      
      When a 32-bit program that was not compiled with large file offsets does a
      stat and gets a st_ino value back that won't fit in the 32 bit field, glibc
      (correctly) generates an EOVERFLOW error.  We can't do anything about fs's
      with larger permanent inode numbers, but when we generate them on the fly, we
      ought to try and have them fit within a 32 bit field.
      
      This patch takes the first step toward this by making the static counters in
      these two functions be 32 bits.
      
      [jlayton@redhat.com: mention that it's only the case for 32bit, non-LFS stat]
      Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
      Cc: Christoph Hellwig <hch@lst.de>
      Cc: Al Viro <viro@zeniv.linux.org.uk>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      866b04fc
    • Jan Nikitenko's avatar
      au1550 SPI controller driver · 63bd2359
      Jan Nikitenko authored
      Here is a driver for the Alchemy au1550 PSC (Programmable Serial
      Controller) in SPI master mode.
      
      It supports dma transfers using the Alchemy descriptor based dma controller
      for 4-8 bits per word SPI transfers.  For 9-24 bits per word transfers, pio
      irq based mode is used to avoid setup of dma channels from scratch on each
      number of bits per word change.
      
      Tested with au1550; this may also work on other MIPS Alchemy cpus, like
      au1200/au1210/au1250.  Used extensively with SD card connected via SPI;
      this handles 8.1MHz SPI clock transfers using dma without any problem (the
      highest SPI clock freq possible with au1550 running on 324MHz).
      
      The driver supports sharing of SPI bus by multiple devices.  All features
      of Alchemy SPI mode are supported (all SPI modes, msb/lsb first, bits per
      word in 4-24 range).
      
      As the SPI clock of the controller depends on main input clock that shall
      be configured externally, platform data structure for au1550 SPI controller
      driver contains mainclk_hz attribute to define the input clock rate.  From
      this value, dividers of the controller for SPI clock are set up for
      required frequency.
      Signed-off-by: default avatarJan Nikitenko <jan.nikitenko@gmail.com>
      
      Whitespace and section fixups.  Remove partial workaround for platform
      setup bug in dma_mask setup; it couldn't work with multiple controllers.
      Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      63bd2359
    • David Brownell's avatar
      SPI kerneldoc · 33e34dc6
      David Brownell authored
      Various documentation updates for the SPI infrastructure, to clarify things
      that may not have been clear, to cope with lack of editing, and fix
      omissions.
      
      Also, plug SPI into the kernel-api DocBook template, and fix all the
      resulting glitches in document generation.
      Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
      Cc: "Randy.Dunlap" <rdunlap@xenotime.net>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      33e34dc6
    • Andrea Paterniani's avatar
      /dev/spidevB.C interface · 814a8d50
      Andrea Paterniani authored
      Add a filesystem API for <linux/spi/spi.h> stack.  The initial version of
      this interface is purely synchronous.
      
      dbrownell@users.sourceforge.net:
      
       Cleaned up, bugfixed; much simplified; added preliminary documentation.
      
       Works with mdev given CONFIG_SYSFS_DEPRECATED; and presumably udev.
      
       Updated SPI_IOC_MESSAGE ioctl to full spi_message semantics, supporting
       groups of one or more transfers (each of which may be full duplex if
       desired).
      
       This is marked as EXPERIMENTAL with an explicit disclaimer that the API
       (notably the ioctls) is subject to change.
      Signed-off-by: default avatarAndrea Paterniani <a.paterniani@swapp-eng.it>
      Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
      Cc: Arnd Bergmann <arnd@arndb.de>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      814a8d50
    • David Brownell's avatar
      minor spi_butterfly cleanup · 735ce95e
      David Brownell authored
      Simplify the spi_butterfly driver by removing incomplete/unused support for
      the second SPI bus, implemented by the USI controller.  This should make
      this a clearer example of how to write a parport bitbang driver.
      Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      735ce95e
    • Josh Boyer's avatar
      8250: Remove commented out irq cruft · fef92c30
      Josh Boyer authored
      Remove some obviously old interrupt disable/enable code that has been
      commented out.
      Signed-off-by: default avatarJosh Boyer <jwboyer@gmail.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      fef92c30
    • Matthias Kaehlcke's avatar
      use mutex instead of semaphore for misc char devices · 0e82d5b6
      Matthias Kaehlcke authored
      The misc character device driver uses a semaphore as mutex.  Use the mutex API
      instead of the (binary) semaphore.
      Signed-off-by: default avatarMatthias Kaehlcke <matthias.kaehlcke@gmail.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      0e82d5b6
    • Matthias Kaehlcke's avatar
      use mutex instead of semaphore in hdaps driver · 6acc369a
      Matthias Kaehlcke authored
      The hdaps driver uses a semaphore as mutex.  Use the mutex API instead of the
      (binary) semaphore.
      Signed-off-by: default avatarMatthias Kaehlcke <matthias.kaehlcke@gmail.com>
      Cc: Robert Love <rlove@rlove.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      6acc369a