|
@@ -165,3 +165,72 @@ static struct mv643xx_eth_platform_data kurobox_pro_eth_data = {
|
|
|
|
|
|
/*****************************************************************************
|
|
|
* RTC 5C372a on I2C bus
|
|
|
+ ****************************************************************************/
|
|
|
+static struct i2c_board_info __initdata kurobox_pro_i2c_rtc = {
|
|
|
+ I2C_BOARD_INFO("rs5c372a", 0x32),
|
|
|
+};
|
|
|
+
|
|
|
+/*****************************************************************************
|
|
|
+ * SATA
|
|
|
+ ****************************************************************************/
|
|
|
+static struct mv_sata_platform_data kurobox_pro_sata_data = {
|
|
|
+ .n_ports = 2,
|
|
|
+};
|
|
|
+
|
|
|
+/*****************************************************************************
|
|
|
+ * Kurobox Pro specific power off method via UART1-attached microcontroller
|
|
|
+ ****************************************************************************/
|
|
|
+
|
|
|
+#define UART1_REG(x) (UART1_VIRT_BASE + ((UART_##x) << 2))
|
|
|
+
|
|
|
+static int kurobox_pro_miconread(unsigned char *buf, int count)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ int timeout;
|
|
|
+
|
|
|
+ for (i = 0; i < count; i++) {
|
|
|
+ timeout = 10;
|
|
|
+
|
|
|
+ while (!(readl(UART1_REG(LSR)) & UART_LSR_DR)) {
|
|
|
+ if (--timeout == 0)
|
|
|
+ break;
|
|
|
+ udelay(1000);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (timeout == 0)
|
|
|
+ break;
|
|
|
+ buf[i] = readl(UART1_REG(RX));
|
|
|
+ }
|
|
|
+
|
|
|
+ /* return read bytes */
|
|
|
+ return i;
|
|
|
+}
|
|
|
+
|
|
|
+static int kurobox_pro_miconwrite(const unsigned char *buf, int count)
|
|
|
+{
|
|
|
+ int i = 0;
|
|
|
+
|
|
|
+ while (count--) {
|
|
|
+ while (!(readl(UART1_REG(LSR)) & UART_LSR_THRE))
|
|
|
+ barrier();
|
|
|
+ writel(buf[i++], UART1_REG(TX));
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int kurobox_pro_miconsend(const unsigned char *data, int count)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ unsigned char checksum = 0;
|
|
|
+ unsigned char recv_buf[40];
|
|
|
+ unsigned char send_buf[40];
|
|
|
+ unsigned char correct_ack[3];
|
|
|
+ int retry = 2;
|
|
|
+
|
|
|
+ /* Generate checksum */
|
|
|
+ for (i = 0; i < count; i++)
|
|
|
+ checksum -= data[i];
|
|
|
+
|
|
|
+ do {
|
|
|
+ /* Send data */
|