#include <linux/atomic.h>
#include <linux/cpumask.h>
#include <linux/platform_device.h>
#include <asm/mipsregs.h>
#define CDMM_ACSR_DEVTYPE_SHIFT 24
#define CDMM_ACSR_DEVTYPE (255ul << CDMM_ACSR_DEVTYPE_SHIFT)
#define CDMM_ACSR_DEVSIZE_SHIFT 16
#define CDMM_ACSR_DEVSIZE (31ul << CDMM_ACSR_DEVSIZE_SHIFT)
#define CDMM_ACSR_DEVREV_SHIFT 12
#define CDMM_ACSR_DEVREV (15ul << CDMM_ACSR_DEVREV_SHIFT)
#define CDMM_ACSR_UW (1ul << 3)
#define CDMM_ACSR_UR (1ul << 2)
#define CDMM_ACSR_SW (1ul << 1)
#define CDMM_ACSR_SR (1ul << 0)
#define to_mips_cdmm_driver(d) container_of(d, struct mips_cdmm_driver, drv)
static phys_addr_t mips_cdmm_default_base;
static const struct mips_cdmm_device_id *
mips_cdmm_lookup(const struct mips_cdmm_device_id *table,
struct mips_cdmm_device *dev)
for (; table->type; ++table) {
ret = (dev->type == table->type);
return ret ? table : NULL;
static int mips_cdmm_match(struct device *dev, struct device_driver *drv)
struct mips_cdmm_device *cdev = to_mips_cdmm_device(dev);
struct mips_cdmm_driver *cdrv = to_mips_cdmm_driver(drv);
return mips_cdmm_lookup(cdrv->id_table, cdev) != NULL;
static int mips_cdmm_uevent(struct device *dev, struct kobj_uevent_env *env)
struct mips_cdmm_device *cdev = to_mips_cdmm_device(dev);
retval = add_uevent_var(env, "CDMM_CPU=%u", cdev->cpu);
retval = add_uevent_var(env, "CDMM_TYPE=0x%02x", cdev->type);
retval = add_uevent_var(env, "CDMM_REV=%u", cdev->rev);
retval = add_uevent_var(env, "MODALIAS=mipscdmm:t%02X", cdev->type);
#define CDMM_ATTR(name, fmt, arg...) \
static ssize_t name##_show(struct device *_dev, \