|
@@ -483,3 +483,70 @@ static struct at24_platform_data eeprom_info = {
|
|
|
|
|
|
/*
|
|
|
* MSP430 supports RTC, card detection, input from IR remote, and
|
|
|
+ * a bit more. It triggers interrupts on GPIO(7) from pressing
|
|
|
+ * buttons on the IR remote, and for card detect switches.
|
|
|
+ */
|
|
|
+static struct i2c_client *dm6446evm_msp;
|
|
|
+
|
|
|
+static int dm6446evm_msp_probe(struct i2c_client *client,
|
|
|
+ const struct i2c_device_id *id)
|
|
|
+{
|
|
|
+ dm6446evm_msp = client;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int dm6446evm_msp_remove(struct i2c_client *client)
|
|
|
+{
|
|
|
+ dm6446evm_msp = NULL;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static const struct i2c_device_id dm6446evm_msp_ids[] = {
|
|
|
+ { "dm6446evm_msp", 0, },
|
|
|
+ { /* end of list */ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct i2c_driver dm6446evm_msp_driver = {
|
|
|
+ .driver.name = "dm6446evm_msp",
|
|
|
+ .id_table = dm6446evm_msp_ids,
|
|
|
+ .probe = dm6446evm_msp_probe,
|
|
|
+ .remove = dm6446evm_msp_remove,
|
|
|
+};
|
|
|
+
|
|
|
+static int dm6444evm_msp430_get_pins(void)
|
|
|
+{
|
|
|
+ static const char txbuf[2] = { 2, 4, };
|
|
|
+ char buf[4];
|
|
|
+ struct i2c_msg msg[2] = {
|
|
|
+ {
|
|
|
+ .flags = 0,
|
|
|
+ .len = 2,
|
|
|
+ .buf = (void __force *)txbuf,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .flags = I2C_M_RD,
|
|
|
+ .len = 4,
|
|
|
+ .buf = buf,
|
|
|
+ },
|
|
|
+ };
|
|
|
+ int status;
|
|
|
+
|
|
|
+ if (!dm6446evm_msp)
|
|
|
+ return -ENXIO;
|
|
|
+
|
|
|
+ msg[0].addr = dm6446evm_msp->addr;
|
|
|
+ msg[1].addr = dm6446evm_msp->addr;
|
|
|
+
|
|
|
+ /* Command 4 == get input state, returns port 2 and port3 data
|
|
|
+ * S Addr W [A] len=2 [A] cmd=4 [A]
|
|
|
+ * RS Addr R [A] [len=4] A [cmd=4] A [port2] A [port3] N P
|
|
|
+ */
|
|
|
+ status = i2c_transfer(dm6446evm_msp->adapter, msg, 2);
|
|
|
+ if (status < 0)
|
|
|
+ return status;
|
|
|
+
|
|
|
+ dev_dbg(&dm6446evm_msp->dev,
|
|
|
+ "PINS: %02x %02x %02x %02x\n",
|
|
|
+ buf[0], buf[1], buf[2], buf[3]);
|
|
|
+
|
|
|
+ return (buf[3] << 8) | buf[2];
|