void mpu_task_on(void *stack) { mpu_disable(); mpu_setaddr(4, (int)(stack + 20)); mpu_setattr(4, mpu_size(CONFIG_TASK_STACK_SIZE) | MPU_RASR_ENABLE | MPU_RASR_ATTR_SCB | MPU_RASR_ATTR_AP_PRW_URW); mpu_enable(); }
static int mpu_suspend(struct device *dev) { struct mpu_data *mpu = dev_get_drvdata(dev); disable_irq(mpu->client->irq); mutex_lock(&mpu->lock); mpu_disable(mpu); mutex_unlock(&mpu->lock); return 0; }
int mpu_pre_init(void) { int i; if (mpu_get_type() != 0x00000800) return EC_ERROR_UNIMPLEMENTED; mpu_disable(); for (i = 0; i < 8; ++i) mpu_config_region(i, CONFIG_RAM_BASE, CONFIG_RAM_SIZE, 0, 0); return EC_SUCCESS; }
static int __devexit mpu_remove(struct i2c_client *client) { struct mpu_data *mpu = i2c_get_clientdata(client); dev_dbg(&client->dev, "enter %s\n", __func__); if (client->irq > 0) { free_irq(client->irq, mpu); gpio_free(mpu->gpio); } disable_irq(mpu->client->irq); input_unregister_device(mpu->input_dev); mpu_disable(mpu); remove_sysfs_interfaces(&client->dev); kfree(mpu); return 0; }
static ssize_t attr_set_enable(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { struct mpu_data *mpu = dev_get_drvdata(dev); unsigned long val; if (strict_strtoul(buf, 10, &val)) return -EINVAL; dev_dbg(dev, "gyro set enable %ld\n", val); mutex_lock(&mpu->lock); if (val) mpu_enable(mpu); else mpu_disable(mpu); mpu->enabled = val; mutex_unlock(&mpu->lock); return size; }
static int __devinit mpu_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct mpu_data *mpu; int ret; dev_info(&client->dev, "probe start. - new\n"); mpu = kzalloc(sizeof(struct mpu_data), GFP_KERNEL); if (!mpu) { ret = -ENOMEM; dev_err(&client->dev, "failed to alloc memory: %d\n", ret); goto exit_alloc_failed; } mutex_init(&mpu->lock); mpu->client = client; i2c_set_clientdata(client, mpu); mpu->poll_interval = DEFAULT_POLL_INTERVAL; mpu->gpio = client->irq; ret = mpu_input_init(mpu); if (ret < 0) { dev_err(&client->dev, "input init failed\n"); goto err_input_init_fail; } ret = mpu_reset(mpu); if (ret < 0) { dev_err(&client->dev, "reset failed\n"); goto err_reset; } ret = mpu_hw_init(mpu); if (ret < 0) { dev_err(&client->dev, "hw init failed\n"); goto err_hw_init; } ret = mpu_setup_irq(mpu); if (ret < 0) { dev_err(&client->dev, "fail to setup irq for gpio %d\n", mpu->gpio); goto err_setup_irq; } mpu->enabled = 0; mpu_disable(mpu); dev_info(&client->dev, "probed\n"); return 0; err_setup_irq: err_hw_init: mpu_disable(mpu); err_reset: input_unregister_device(mpu->input_dev); remove_sysfs_interfaces(&client->dev); err_input_init_fail: kfree(mpu); exit_alloc_failed: dev_err(&client->dev, "Driver Init failed\n"); return ret; }