162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * via-pmu event device for reporting some events that come through the PMU 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright 2006 Johannes Berg <johannes@sipsolutions.net> 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * This program is free software; you can redistribute it and/or modify 762306a36Sopenharmony_ci * it under the terms of the GNU General Public License as published by 862306a36Sopenharmony_ci * the Free Software Foundation; either version 2 of the License, or 962306a36Sopenharmony_ci * (at your option) any later version. 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * This program is distributed in the hope that it will be useful, but 1262306a36Sopenharmony_ci * WITHOUT ANY WARRANTY; without even the implied warranty of 1362306a36Sopenharmony_ci * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 1462306a36Sopenharmony_ci * NON INFRINGEMENT. See the GNU General Public License for more 1562306a36Sopenharmony_ci * details. 1662306a36Sopenharmony_ci * 1762306a36Sopenharmony_ci * You should have received a copy of the GNU General Public License 1862306a36Sopenharmony_ci * along with this program; if not, write to the Free Software 1962306a36Sopenharmony_ci * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 2062306a36Sopenharmony_ci * 2162306a36Sopenharmony_ci */ 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#include <linux/input.h> 2462306a36Sopenharmony_ci#include <linux/adb.h> 2562306a36Sopenharmony_ci#include <linux/pmu.h> 2662306a36Sopenharmony_ci#include "via-pmu-event.h" 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistatic struct input_dev *pmu_input_dev; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistatic int __init via_pmu_event_init(void) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci int err; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci /* do other models report button/lid status? */ 3562306a36Sopenharmony_ci if (pmu_get_model() != PMU_KEYLARGO_BASED) 3662306a36Sopenharmony_ci return -ENODEV; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci pmu_input_dev = input_allocate_device(); 3962306a36Sopenharmony_ci if (!pmu_input_dev) 4062306a36Sopenharmony_ci return -ENOMEM; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci pmu_input_dev->name = "PMU"; 4362306a36Sopenharmony_ci pmu_input_dev->id.bustype = BUS_HOST; 4462306a36Sopenharmony_ci pmu_input_dev->id.vendor = 0x0001; 4562306a36Sopenharmony_ci pmu_input_dev->id.product = 0x0001; 4662306a36Sopenharmony_ci pmu_input_dev->id.version = 0x0100; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci set_bit(EV_KEY, pmu_input_dev->evbit); 4962306a36Sopenharmony_ci set_bit(EV_SW, pmu_input_dev->evbit); 5062306a36Sopenharmony_ci set_bit(KEY_POWER, pmu_input_dev->keybit); 5162306a36Sopenharmony_ci set_bit(SW_LID, pmu_input_dev->swbit); 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci err = input_register_device(pmu_input_dev); 5462306a36Sopenharmony_ci if (err) 5562306a36Sopenharmony_ci input_free_device(pmu_input_dev); 5662306a36Sopenharmony_ci return err; 5762306a36Sopenharmony_ci} 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_civoid via_pmu_event(int key, int down) 6062306a36Sopenharmony_ci{ 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci if (unlikely(!pmu_input_dev)) 6362306a36Sopenharmony_ci return; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci switch (key) { 6662306a36Sopenharmony_ci case PMU_EVT_POWER: 6762306a36Sopenharmony_ci input_report_key(pmu_input_dev, KEY_POWER, down); 6862306a36Sopenharmony_ci break; 6962306a36Sopenharmony_ci case PMU_EVT_LID: 7062306a36Sopenharmony_ci input_report_switch(pmu_input_dev, SW_LID, down); 7162306a36Sopenharmony_ci break; 7262306a36Sopenharmony_ci default: 7362306a36Sopenharmony_ci /* no such key handled */ 7462306a36Sopenharmony_ci return; 7562306a36Sopenharmony_ci } 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci input_sync(pmu_input_dev); 7862306a36Sopenharmony_ci} 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cilate_initcall(via_pmu_event_init); 81