};
enum jack_types {
- jack_type_charger = 0,
+ jack_type_list = 0,
+ jack_type_charger,
jack_type_earjack,
jack_type_earkey,
jack_type_hdmi,
jack_type_max
};
+enum jack_capabilities {
+ jack_cap_charger = 0x01,
+ jack_cap_earjack = 0x02,
+ jack_cap_earkey = 0x04,
+ jack_cap_hdmi = 0x08,
+ jack_cap_usb = 0x10
+};
+
enum request_cmd {
request_get = 0,
request_set,
struct virtio_jack *v_jack;
static char jack_data [PAGE_SIZE];
+static int jack_capability = 0;
static DECLARE_WAIT_QUEUE_HEAD(wq);
#define DLOG(level, fmt, ...)
#endif
+static int jack_atoi(const char *name)
+{
+ int val = 0;
+
+ for (;; name++) {
+ switch (*name) {
+ case '0' ... '9':
+ val = 10*val+(*name-'0');
+ break;
+ default:
+ return val;
+ }
+ }
+}
+
static void jack_vq_done(struct virtqueue *vq) {
unsigned int len;
struct msg_info* msg;
DLOG(KERN_INFO, "sysfs_create_file\n");
- result = device_create_file(dev, &dev_attr_charger_online);
- if (result){
- DLOG(KERN_ERR, "failed to create charger_online file\n");
- return result;
+ if (jack_capability & jack_cap_charger) {
+ result = device_create_file(dev, &dev_attr_charger_online);
+ if (result){
+ DLOG(KERN_ERR, "failed to create charger_online file\n");
+ return result;
+ }
}
- result = device_create_file(dev, &dev_attr_earjack_online);
- if (result){
- DLOG(KERN_ERR, "failed to create earjack_online file\n");
- return result;
+ if (jack_capability & jack_cap_earjack) {
+ result = device_create_file(dev, &dev_attr_earjack_online);
+ if (result){
+ DLOG(KERN_ERR, "failed to create earjack_online file\n");
+ return result;
+ }
}
- result = device_create_file(dev, &dev_attr_earkey_online);
- if (result){
- DLOG(KERN_ERR, "failed to create earkey_online file\n");
- return result;
+ if (jack_capability & jack_cap_earkey) {
+ result = device_create_file(dev, &dev_attr_earkey_online);
+ if (result){
+ DLOG(KERN_ERR, "failed to create earkey_online file\n");
+ return result;
+ }
}
- result = device_create_file(dev, &dev_attr_hdmi_online);
- if (result){
- DLOG(KERN_ERR, "failed to create hdmi_online file\n");
- return result;
+ if (jack_capability & jack_cap_hdmi) {
+ result = device_create_file(dev, &dev_attr_hdmi_online);
+ if (result){
+ DLOG(KERN_ERR, "failed to create hdmi_online file\n");
+ return result;
+ }
}
- result = device_create_file(dev, &dev_attr_usb_online);
- if (result){
- DLOG(KERN_ERR, "failed to create usb_online file\n");
- return result;
+ if (jack_capability & jack_cap_usb) {
+ result = device_create_file(dev, &dev_attr_usb_online);
+ if (result){
+ DLOG(KERN_ERR, "failed to create usb_online file\n");
+ return result;
+ }
}
return 0;
dev_set_drvdata(&the_pdev.dev, (void*)data);
- err = maru_jack_sysfs_create_file(&the_pdev.dev);
- if (err) {
- DLOG(KERN_ERR, "sysfs_create_file failure\n");
- kfree(data);
- platform_device_unregister(&the_pdev);
- return err;
- }
-
v_jack->vq = virtio_find_single_vq(dev, jack_vq_done, "jack");
if (IS_ERR(v_jack->vq)) {
DLOG(KERN_ERR, "virtio queue is not found.\n");
mutex_init(&v_jack->lock);
+ get_jack_data(jack_type_list);
+ jack_capability = jack_atoi(jack_data);
+ DLOG(KERN_INFO, "jack capability is %02x", jack_capability);
+
+ err = maru_jack_sysfs_create_file(&the_pdev.dev);
+ if (err) {
+ DLOG(KERN_ERR, "sysfs_create_file failure\n");
+ kfree(data);
+ platform_device_unregister(&the_pdev);
+ return err;
+ }
+
return 0;
}
#define DEVICE_COUNT 5
enum sensor_types {
- sensor_type_accel = 0,
+ sensor_type_list = 0,
+ sensor_type_accel,
sensor_type_geo,
sensor_type_gyro,
sensor_type_gyro_x,
sensor_type_max
};
+enum sensor_capabilities {
+ sensor_cap_accel = 0x01,
+ sensor_cap_geo = 0x02,
+ sensor_cap_gyro = 0x04,
+ sensor_cap_light = 0x08,
+ sensor_cap_proxi = 0x10
+};
+
+enum sensor_attributes {
+ sensor_attr_accel = 0,
+ sensor_attr_geo,
+ sensor_attr_gyro,
+ sensor_attr_light,
+ sensor_attr_proxi
+};
+
enum request_cmd {
request_get = 0,
request_set,
}
static char sensor_data [PAGE_SIZE];
+static int sensor_capability = 0;
static void sensor_vq_done(struct virtqueue *rvq) {
unsigned int len;
wake_up_interruptible(&wq);
}
+static int sensor_atoi(const char *name)
+{
+ int val = 0;
+
+ for (;; name++) {
+ switch (*name) {
+ case '0' ... '9':
+ val = 10*val+(*name-'0');
+ break;
+ default:
+ return val;
+ }
+ }
+}
+
static void set_sensor_data(int type, const char* buf)
{
int err = 0;
int ret = 0;
for (i = 0; i < DEVICE_COUNT; i++) {
-
+ if (i == sensor_attr_accel && !(sensor_capability & sensor_cap_accel)) {
+ continue;
+ } else if (i == sensor_attr_geo && !(sensor_capability & sensor_cap_geo)) {
+ continue;
+ } else if (i == sensor_attr_gyro && !(sensor_capability & sensor_cap_gyro)) {
+ continue;
+ } else if (i == sensor_attr_light && !(sensor_capability & sensor_cap_light)) {
+ continue;
+ } else if (i == sensor_attr_proxi && !(sensor_capability & sensor_cap_proxi)) {
+ continue;
+ }
device_list[i] = device_create(sensor_class, NULL, (dev_t)NULL, NULL, device_name_list[i]);
if (device_list[i] < 0) {
LOG(KERN_ERR, "%dth sensor device creation is failed.", i);
return -1;
}
- ret = init_device();
- if (ret) {
- cleanup(dev);
- return ret;
- }
-
vs->vq = virtio_find_single_vq(dev, sensor_vq_done, "sensor");
if (IS_ERR(vs->vq)) {
cleanup(dev);
LOG(KERN_INFO, "Sensor probe completes");
+ get_sensor_data(sensor_type_list);
+ sensor_capability = sensor_atoi(sensor_data);
+ LOG(KERN_INFO, "sensor capability is %02x", sensor_capability);
+
+ ret = init_device();
+ if (ret) {
+ LOG(KERN_ERR, "failed initialing devices");
+ cleanup(dev);
+ return ret;
+ }
+
return err;
}