--- orig/kernel-source/arch/arm/mach-omap2/smartreflex.c 2009-12-17 09:29:39.000000000 +0200 +++ kernel-source/arch/arm/mach-omap2/smartreflex.c 2010-04-13 00:07:20.000000000 +0300 @@ -940,6 +963,59 @@ return SR_PASS; } +static ssize_t omap_sr_vdd1_opps_vsel_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + int i; + char *b=buf; + for(i=1;i<=MAX_VDD1_OPP;i++) + b+=sprintf(b, "%d ", mpu_opps[i].vsel); + b+=sprintf(b, "\n"); + return b-buf; + +} + +static ssize_t omap_sr_vdd1_opps_vsel_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t n) +{ + unsigned short value[16]; + int i; + + if (sscanf(buf, "%hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu", + &value[0], &value[1], &value[2], &value[3], + &value[4], &value[5], &value[6], &value[7], + &value[8], &value[9], &value[10], &value[11], + &value[12], &value[13], &value[14], &value[15] + ) != MAX_VDD1_OPP) { + printk(KERN_ERR "sr_vdd1_opps_vsel: Invalid value\n"); + return -EINVAL; + } + + + mutex_lock(&dvfs_mutex); + + for(i=1;i<=MAX_VDD1_OPP;i++) { + if(value[i-1]<0x49) { + mpu_opps[i].vsel = value[i-1]; + } + } + + mutex_unlock(&dvfs_mutex); + + return n; +} + +static struct kobj_attribute sr_vdd1_opps_vsel = { + .attr = { + .name = __stringify(sr_vdd1_opps_vsel), + .mode = 0644, + }, + .show = omap_sr_vdd1_opps_vsel_show, + .store = omap_sr_vdd1_opps_vsel_store, +}; + + /* Sysfs interface to select SR VDD1 auto compensation */ static ssize_t omap_sr_vdd1_autocomp_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) @@ -1075,6 +1151,10 @@ printk(KERN_INFO "SmartReflex driver initialized\n"); + ret = sysfs_create_file(power_kobj, &sr_vdd1_opps_vsel.attr); + if (ret) + printk(KERN_ERR "sysfs_create_file failed: %d\n", ret); + ret = sysfs_create_file(power_kobj, &sr_vdd1_autocomp.attr); if (ret) printk(KERN_ERR "sysfs_create_file failed: %d\n", ret);