Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 37cc7943 authored by Paul Mundt's avatar Paul Mundt Committed by Linus Torvalds
Browse files

[PATCH] sh: convert voyagergx to platform device, drop sh-bus



Trivial patch updating the voyagergx cchip code to reference a platform device
instead, now that the dma mask is taken care of.  Given this, there's no
longer any reason to drag around the SH-bus code, so kill that off entirely.

Signed-off-by: default avatarManuel Lauss <mano@roarinelk.homelinux.net>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 8d27e081
Loading
Loading
Loading
Loading
+5 −10
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@
#include <linux/module.h>
#include <linux/device.h>
#include <asm/io.h>
#include <asm/bus-sh.h>


struct voya_alloc_entry {
	struct list_head list;
@@ -30,12 +30,13 @@ static LIST_HEAD(voya_alloc_list);
#define OHCI_HCCA_SIZE	0x100
#define OHCI_SRAM_SIZE	0x10000

#define VOYAGER_OHCI_NAME	"voyager-ohci"

void *voyagergx_consistent_alloc(struct device *dev, size_t size,
				 dma_addr_t *handle, gfp_t flag)
{
	struct list_head *list = &voya_alloc_list;
	struct voya_alloc_entry *entry;
	struct sh_dev *shdev = to_sh_dev(dev);
	unsigned long start, end;
	unsigned long flags;

@@ -46,9 +47,7 @@ void *voyagergx_consistent_alloc(struct device *dev, size_t size,
	 *
	 * Everything else goes through consistent_alloc().
	 */
	if (!dev || dev->bus != &sh_bus_types[SH_BUS_VIRT] ||
		   (dev->bus == &sh_bus_types[SH_BUS_VIRT] &&
		    shdev->dev_id != SH_DEV_ID_USB_OHCI))
	if (!dev || strcmp(dev->driver->name, VOYAGER_OHCI_NAME))
		return NULL;

	start = OHCI_SRAM_START + OHCI_HCCA_SIZE;
@@ -98,12 +97,9 @@ int voyagergx_consistent_free(struct device *dev, size_t size,
			      void *vaddr, dma_addr_t handle)
{
	struct voya_alloc_entry *entry;
	struct sh_dev *shdev = to_sh_dev(dev);
	unsigned long flags;

	if (!dev || dev->bus != &sh_bus_types[SH_BUS_VIRT] ||
		   (dev->bus == &sh_bus_types[SH_BUS_VIRT] &&
		    shdev->dev_id != SH_DEV_ID_USB_OHCI))
	if (!dev || strcmp(dev->driver->name, VOYAGER_OHCI_NAME))
		return -EINVAL;

	spin_lock_irqsave(&voya_list_lock, flags);
@@ -123,4 +119,3 @@ int voyagergx_consistent_free(struct device *dev, size_t size,

EXPORT_SYMBOL(voyagergx_consistent_alloc);
EXPORT_SYMBOL(voyagergx_consistent_free);
+6 −1
Original line number Diff line number Diff line
@@ -163,7 +163,12 @@ int voyagergx_irq_demux(int irq)
	return irq;
}

static struct irqaction irq0  = { voyagergx_interrupt, SA_INTERRUPT, 0, "VOYAGERGX", NULL, NULL};
static struct irqaction irq0  = {
	.name		= "voyagergx",
	.handler	= voyagergx_interrupt,
	.flags		= SA_INTERRUPT,
	.mask		= CPU_MASK_NONE,
};

void __init setup_voyagergx_irq(void)
{
+1 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
# Makefile for the Linux/SuperH CPU-specifc backends.
#

obj-y	+= irq/ init.o bus.o clock.o
obj-y	+= irq/ init.o clock.o

obj-$(CONFIG_CPU_SH2)		+= sh2/
obj-$(CONFIG_CPU_SH3)		+= sh3/

arch/sh/kernel/cpu/bus.c

deleted100644 → 0
+0 −197
Original line number Diff line number Diff line
/*
 * arch/sh/kernel/cpu/bus.c
 *
 * Virtual bus for SuperH.
 *
 * Copyright (C) 2004 Paul Mundt
 *
 * Shamelessly cloned from arch/arm/mach-omap/bus.c, which was written
 * by:
 *
 *  	Copyright (C) 2003 - 2004 Nokia Corporation
 *  	Written by Tony Lindgren <tony@atomide.com>
 *  	Portions of code based on sa1111.c.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.
 */
#include <linux/kernel.h>
#include <linux/device.h>
#include <linux/init.h>
#include <linux/module.h>
#include <asm/bus-sh.h>

static int sh_bus_match(struct device *dev, struct device_driver *drv)
{
	struct sh_driver *shdrv = to_sh_driver(drv);
	struct sh_dev *shdev = to_sh_dev(dev);

	return shdev->dev_id == shdrv->dev_id;
}

static int sh_bus_suspend(struct device *dev, pm_message_t state)
{
	struct sh_dev *shdev = to_sh_dev(dev);
	struct sh_driver *shdrv = to_sh_driver(dev->driver);

	if (shdrv && shdrv->suspend)
		return shdrv->suspend(shdev, state);

	return 0;
}

static int sh_bus_resume(struct device *dev)
{
	struct sh_dev *shdev = to_sh_dev(dev);
	struct sh_driver *shdrv = to_sh_driver(dev->driver);

	if (shdrv && shdrv->resume)
		return shdrv->resume(shdev);

	return 0;
}

static int sh_device_probe(struct device *dev)
{
	struct sh_dev *shdev = to_sh_dev(dev);
	struct sh_driver *shdrv = to_sh_driver(dev->driver);

	if (shdrv && shdrv->probe)
		return shdrv->probe(shdev);

	return -ENODEV;
}

static int sh_device_remove(struct device *dev)
{
	struct sh_dev *shdev = to_sh_dev(dev);
	struct sh_driver *shdrv = to_sh_driver(dev->driver);

	if (shdrv && shdrv->remove)
		return shdrv->remove(shdev);

	return 0;
}

static struct device sh_bus_devices[SH_NR_BUSES] = {
	{
		.bus_id		= SH_BUS_NAME_VIRT,
	},
};

struct bus_type sh_bus_types[SH_NR_BUSES] = {
	{
		.name		= SH_BUS_NAME_VIRT,
		.match		= sh_bus_match,
		.probe		= sh_bus_probe,
		.remove		= sh_bus_remove,
		.suspend	= sh_bus_suspend,
		.resume		= sh_bus_resume,
	},
};

int sh_device_register(struct sh_dev *dev)
{
	if (!dev)
		return -EINVAL;

	if (dev->bus_id < 0 || dev->bus_id >= SH_NR_BUSES) {
		printk(KERN_ERR "%s: bus_id invalid: %s bus: %d\n",
		       __FUNCTION__, dev->name, dev->bus_id);
		return -EINVAL;
	}

	dev->dev.parent = &sh_bus_devices[dev->bus_id];
	dev->dev.bus    = &sh_bus_types[dev->bus_id];

	/* This is needed for USB OHCI to work */
	if (dev->dma_mask)
		dev->dev.dma_mask = dev->dma_mask;
	if (dev->coherent_dma_mask)
		dev->dev.coherent_dma_mask = dev->coherent_dma_mask;

	snprintf(dev->dev.bus_id, BUS_ID_SIZE, "%s%u",
		 dev->name, dev->dev_id);

	printk(KERN_INFO "Registering SH device '%s'. Parent at %s\n",
	       dev->dev.bus_id, dev->dev.parent->bus_id);

	return device_register(&dev->dev);
}

void sh_device_unregister(struct sh_dev *dev)
{
	device_unregister(&dev->dev);
}

int sh_driver_register(struct sh_driver *drv)
{
	if (!drv)
		return -EINVAL;

	if (drv->bus_id < 0 || drv->bus_id >= SH_NR_BUSES) {
		printk(KERN_ERR "%s: bus_id invalid: bus: %d device %d\n",
		       __FUNCTION__, drv->bus_id, drv->dev_id);
		return -EINVAL;
	}

	drv->drv.bus    = &sh_bus_types[drv->bus_id];

	return driver_register(&drv->drv);
}

void sh_driver_unregister(struct sh_driver *drv)
{
	driver_unregister(&drv->drv);
}

static int __init sh_bus_init(void)
{
	int i, ret = 0;

	for (i = 0; i < SH_NR_BUSES; i++) {
		ret = device_register(&sh_bus_devices[i]);
		if (ret != 0) {
			printk(KERN_ERR "Unable to register bus device %s\n",
			       sh_bus_devices[i].bus_id);
			continue;
		}

		ret = bus_register(&sh_bus_types[i]);
		if (ret != 0) {
			printk(KERN_ERR "Unable to register bus %s\n",
			       sh_bus_types[i].name);
			device_unregister(&sh_bus_devices[i]);
		}
	}

	printk(KERN_INFO "SH Virtual Bus initialized\n");

	return ret;
}

static void __exit sh_bus_exit(void)
{
	int i;

	for (i = 0; i < SH_NR_BUSES; i++) {
		bus_unregister(&sh_bus_types[i]);
		device_unregister(&sh_bus_devices[i]);
	}
}

module_init(sh_bus_init);
module_exit(sh_bus_exit);

MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>");
MODULE_DESCRIPTION("SH Virtual Bus");
MODULE_LICENSE("GPL");

EXPORT_SYMBOL(sh_bus_types);
EXPORT_SYMBOL(sh_device_register);
EXPORT_SYMBOL(sh_device_unregister);
EXPORT_SYMBOL(sh_driver_register);
EXPORT_SYMBOL(sh_driver_unregister);

include/asm-sh/bus-sh.h

deleted100644 → 0
+0 −66
Original line number Diff line number Diff line
/*
 * include/asm-sh/bus-sh.h
 *
 * Copyright (C) 2004 Paul Mundt
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 */
#ifndef __ASM_SH_BUS_SH_H
#define __ASM_SH_BUS_SH_H

extern struct bus_type sh_bus_types[];

struct sh_dev {
	struct device	dev;
	char		*name;
	unsigned int	dev_id;
	unsigned int	bus_id;
	struct resource	res;
	void		*mapbase;
	unsigned int	irq[6];
	u64		*dma_mask;
	u64		coherent_dma_mask;
};

#define to_sh_dev(d)	container_of((d), struct sh_dev, dev)

#define sh_get_drvdata(d)	dev_get_drvdata(&(d)->dev)
#define sh_set_drvdata(d,p)	dev_set_drvdata(&(d)->dev, (p))

struct sh_driver {
	struct device_driver	drv;
	unsigned int		dev_id;
	unsigned int		bus_id;
	int (*probe)(struct sh_dev *);
	int (*remove)(struct sh_dev *);
	int (*suspend)(struct sh_dev *, pm_message_t);
	int (*resume)(struct sh_dev *);
};

#define to_sh_driver(d)	container_of((d), struct sh_driver, drv)
#define sh_name(d)	((d)->dev.driver->name)

/*
 * Device ID numbers for bus types
 */
enum {
	SH_DEV_ID_USB_OHCI,
};

#define SH_NR_BUSES		1
#define SH_BUS_NAME_VIRT	"shbus"

enum {
	SH_BUS_VIRT,
};

/* arch/sh/kernel/cpu/bus.c */
extern int sh_device_register(struct sh_dev *dev);
extern void sh_device_unregister(struct sh_dev *dev);
extern int sh_driver_register(struct sh_driver *drv);
extern void sh_driver_unregister(struct sh_driver *drv);

#endif /* __ASM_SH_BUS_SH_H */